// Copyright 2010 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by google-apis-code-generator 1.5.1
//     Build date: 2015-03-26 20:30:19 UTC
//     on: 2015-04-10, 22:03:52 UTC
//     C# generater version: 
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

/**
 * \mainpage
 *   YouTube Data API Version v3
 *
 * \section ApiInfo API Version Information
 *    <table>
 *      <tr><th>API
 *          <td><a href='https://developers.google.com/youtube/v3'>YouTube Data API</a>
 *      <tr><th>API Version<td>v3
 *      <tr><th>API Rev<td>133
 *      <tr><th>API Docs
 *          <td><a href='https://developers.google.com/youtube/v3'>
 *              https://developers.google.com/youtube/v3</a>
 *      <tr><th>Discovery Name<td>youtube
 *      <tr><th>Generated At<td>2015-04-10 22:03:52 UTC
 *      <tr><th>C# Generator<td>google-apis-code-generator
 *      <tr><th>Generator Version
 *          <td>1.5.1 / c#=1.9.0
 *      <tr><th>Generator Build<td>2015-03-26 20:30:19 UTC
 *    </table>
 *
 * \section ForMoreInfo For More Information
 *
 * The complete API documentation for using YouTube Data API can be found at
 * <a href='https://developers.google.com/youtube/v3'>https://developers.google.com/youtube/v3</a>.
 *
 * For more information about the Google APIs Client Library for .NET, see
 * <a href='https://developers.google.com/api-client-library/dotnet/get_started'>
 * https://developers.google.com/api-client-library/dotnet/get_started</a>
 */

namespace Google.Apis.YouTube.v3.Data
{    

    /// <summary>Rights management policy for YouTube resources.</summary>
    public class AccessPolicy : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The value of allowed indicates whether the access to the policy is allowed or denied by
        /// default.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("allowed")]
        public virtual System.Nullable<bool> Allowed { get; set; } 

        /// <summary>A list of region codes that identify countries where the default policy do not apply.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("exception")]
        public virtual System.Collections.Generic.IList<string> Exception { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An activity resource contains information about an action that a particular channel, or user, has taken
    /// on YouTube.The actions reported in activity feeds include rating a video, sharing a video, marking a video as a
    /// favorite, commenting on a video, uploading a video, and so forth. Each activity resource identifies the type of
    /// action, the channel associated with the action, and the resource(s) associated with the action, such as the
    /// video that was rated or uploaded.</summary>
    public class Activity : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object contains information about the content associated with the activity. For
        /// example, if the snippet.type value is videoRated, then the contentDetails object's content identifies the
        /// rated video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual ActivityContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the activity.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#activity".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the activity, including the activity's type and
        /// group ID.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual ActivitySnippet Snippet { get; set; } 

    }    

    /// <summary>Details about the content of an activity: the video that was shared, the channel that was subscribed
    /// to, etc.</summary>
    public class ActivityContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The bulletin object contains details about a channel bulletin post. This object is only present if
        /// the snippet.type is bulletin.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bulletin")]
        public virtual ActivityContentDetailsBulletin Bulletin { get; set; } 

        /// <summary>The channelItem object contains details about a resource which was added to a channel. This
        /// property is only present if the snippet.type is channelItem.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelItem")]
        public virtual ActivityContentDetailsChannelItem ChannelItem { get; set; } 

        /// <summary>The comment object contains information about a resource that received a comment. This property is
        /// only present if the snippet.type is comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("comment")]
        public virtual ActivityContentDetailsComment Comment { get; set; } 

        /// <summary>The favorite object contains information about a video that was marked as a favorite video. This
        /// property is only present if the snippet.type is favorite.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("favorite")]
        public virtual ActivityContentDetailsFavorite Favorite { get; set; } 

        /// <summary>The like object contains information about a resource that received a positive (like) rating. This
        /// property is only present if the snippet.type is like.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("like")]
        public virtual ActivityContentDetailsLike Like { get; set; } 

        /// <summary>The playlistItem object contains information about a new playlist item. This property is only
        /// present if the snippet.type is playlistItem.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlistItem")]
        public virtual ActivityContentDetailsPlaylistItem PlaylistItem { get; set; } 

        /// <summary>The promotedItem object contains details about a resource which is being promoted. This property is
        /// only present if the snippet.type is promotedItem.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("promotedItem")]
        public virtual ActivityContentDetailsPromotedItem PromotedItem { get; set; } 

        /// <summary>The recommendation object contains information about a recommended resource. This property is only
        /// present if the snippet.type is recommendation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recommendation")]
        public virtual ActivityContentDetailsRecommendation Recommendation { get; set; } 

        /// <summary>The social object contains details about a social network post. This property is only present if
        /// the snippet.type is social.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("social")]
        public virtual ActivityContentDetailsSocial Social { get; set; } 

        /// <summary>The subscription object contains information about a channel that a user subscribed to. This
        /// property is only present if the snippet.type is subscription.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("subscription")]
        public virtual ActivityContentDetailsSubscription Subscription { get; set; } 

        /// <summary>The upload object contains information about the uploaded video. This property is only present if
        /// the snippet.type is upload.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("upload")]
        public virtual ActivityContentDetailsUpload Upload { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about a channel bulletin post.</summary>
    public class ActivityContentDetailsBulletin : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the resource associated with a bulletin
        /// post.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about a resource which was added to a channel.</summary>
    public class ActivityContentDetailsChannelItem : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the resource that was added to the
        /// channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a resource that received a comment.</summary>
    public class ActivityContentDetailsComment : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the resource associated with the
        /// comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a video that was marked as a favorite video.</summary>
    public class ActivityContentDetailsFavorite : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the resource that was marked as a
        /// favorite.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a resource that received a positive (like) rating.</summary>
    public class ActivityContentDetailsLike : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the rated resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a new playlist item.</summary>
    public class ActivityContentDetailsPlaylistItem : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The value that YouTube uses to uniquely identify the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlistId")]
        public virtual string PlaylistId { get; set; } 

        /// <summary>ID of the item within the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlistItemId")]
        public virtual string PlaylistItemId { get; set; } 

        /// <summary>The resourceId object contains information about the resource that was added to the
        /// playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about a resource which is being promoted.</summary>
    public class ActivityContentDetailsPromotedItem : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The URL the client should fetch to request a promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("adTag")]
        public virtual string AdTag { get; set; } 

        /// <summary>The URL the client should ping to indicate that the user clicked through on this promoted
        /// item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("clickTrackingUrl")]
        public virtual string ClickTrackingUrl { get; set; } 

        /// <summary>The URL the client should ping to indicate that the user was shown this promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("creativeViewUrl")]
        public virtual string CreativeViewUrl { get; set; } 

        /// <summary>The type of call-to-action, a message to the user indicating action that can be taken.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ctaType")]
        public virtual string CtaType { get; set; } 

        /// <summary>The custom call-to-action button text. If specified, it will override the default button text for
        /// the cta_type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("customCtaButtonText")]
        public virtual string CustomCtaButtonText { get; set; } 

        /// <summary>The text description to accompany the promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("descriptionText")]
        public virtual string DescriptionText { get; set; } 

        /// <summary>The URL the client should direct the user to, if the user chooses to visit the advertiser's
        /// website.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("destinationUrl")]
        public virtual string DestinationUrl { get; set; } 

        /// <summary>The list of forecasting URLs. The client should ping all of these URLs when a promoted item is not
        /// available, to indicate that a promoted item could have been shown.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("forecastingUrl")]
        public virtual System.Collections.Generic.IList<string> ForecastingUrl { get; set; } 

        /// <summary>The list of impression URLs. The client should ping all of these URLs to indicate that the user was
        /// shown this promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("impressionUrl")]
        public virtual System.Collections.Generic.IList<string> ImpressionUrl { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the promoted video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information that identifies the recommended resource.</summary>
    public class ActivityContentDetailsRecommendation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The reason that the resource is recommended to the user.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("reason")]
        public virtual string Reason { get; set; } 

        /// <summary>The resourceId object contains information that identifies the recommended resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The seedResourceId object contains information about the resource that caused the
        /// recommendation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("seedResourceId")]
        public virtual ResourceId SeedResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about a social network post.</summary>
    public class ActivityContentDetailsSocial : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The author of the social network post.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("author")]
        public virtual string Author { get; set; } 

        /// <summary>An image of the post's author.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("imageUrl")]
        public virtual string ImageUrl { get; set; } 

        /// <summary>The URL of the social network post.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("referenceUrl")]
        public virtual string ReferenceUrl { get; set; } 

        /// <summary>The resourceId object encapsulates information that identifies the resource associated with a
        /// social network post.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The name of the social network.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a channel that a user subscribed to.</summary>
    public class ActivityContentDetailsSubscription : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The resourceId object contains information that identifies the resource that the user subscribed
        /// to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about the uploaded video.</summary>
    public class ActivityContentDetailsUpload : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the uploaded video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ActivityListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of activities, or events, that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Activity> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#activityListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about an activity, including title, description, thumbnails, activity type and
    /// group.</summary>
    public class ActivitySnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the channel associated with the activity.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Channel title for the channel responsible for this activity</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>The description of the resource primarily associated with the activity.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The group ID associated with the activity. A group ID identifies user events that are associated
        /// with the same user and resource. For example, if a user rates a video and marks the same video as a
        /// favorite, the entries for those events would have the same group ID in the user's activity feed. In your
        /// user interface, you can avoid repetition by grouping events with the same groupId value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("groupId")]
        public virtual string GroupId { get; set; } 

        /// <summary>The date and time that the video was uploaded. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>A map of thumbnail images associated with the resource that is primarily associated with the
        /// activity. For each object in the map, the key is the name of the thumbnail image, and the value is an object
        /// that contains other information about the thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The title of the resource primarily associated with the activity.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The type of activity that the resource describes.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A caption resource represents a YouTube caption track. A caption track is associated with exactly one
    /// YouTube video.</summary>
    public class Caption : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the caption track.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#caption".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the caption.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual CaptionSnippet Snippet { get; set; } 

    }    

    public class CaptionListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of captions that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Caption> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#captionListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a caption track, such as its language and name.</summary>
    public class CaptionSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The type of audio track associated with the caption track.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("audioTrackType")]
        public virtual string AudioTrackType { get; set; } 

        /// <summary>The reason that YouTube failed to process the caption track. This property is only present if the
        /// state property's value is failed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("failureReason")]
        public virtual string FailureReason { get; set; } 

        /// <summary>Indicates whether YouTube synchronized the caption track to the audio track in the video. The value
        /// will be true if a sync was explicitly requested when the caption track was uploaded. For example, when
        /// calling the captions.insert or captions.update methods, you can set the sync parameter to true to instruct
        /// YouTube to sync the uploaded track to the video. If the value is false, YouTube uses the time codes in the
        /// uploaded caption track to determine when to display captions.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isAutoSynced")]
        public virtual System.Nullable<bool> IsAutoSynced { get; set; } 

        /// <summary>Indicates whether the track contains closed captions for the deaf and hard of hearing. The default
        /// value is false.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isCC")]
        public virtual System.Nullable<bool> IsCC { get; set; } 

        /// <summary>Indicates whether the caption track is a draft. If the value is true, then the track is not
        /// publicly visible. The default value is false.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isDraft")]
        public virtual System.Nullable<bool> IsDraft { get; set; } 

        /// <summary>Indicates whether caption track is formatted for "easy reader," meaning it is at a third-grade
        /// level for language learners. The default value is false.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isEasyReader")]
        public virtual System.Nullable<bool> IsEasyReader { get; set; } 

        /// <summary>Indicates whether the caption track uses large text for the vision-impaired. The default value is
        /// false.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isLarge")]
        public virtual System.Nullable<bool> IsLarge { get; set; } 

        /// <summary>The language of the caption track. The property value is a BCP-47 language tag.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("language")]
        public virtual string Language { get; set; } 

        /// <summary>The date and time when the caption track was last updated. The value is specified in ISO 8601
        /// (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("lastUpdated")]
        public virtual string LastUpdatedRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="LastUpdatedRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> LastUpdated
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(LastUpdatedRaw);
            }
            set
            {
                LastUpdatedRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The name of the caption track. The name is intended to be visible to the user as an option during
        /// playback.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The caption track's status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual string Status { get; set; } 

        /// <summary>The caption track's type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("trackKind")]
        public virtual string TrackKind { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the video associated with the caption
        /// track.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Brief description of the live stream cdn settings.</summary>
    public class CdnSettings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The format of the video stream that you are sending to Youtube.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("format")]
        public virtual string Format { get; set; } 

        /// <summary>The ingestionInfo object contains information that YouTube provides that you need to transmit your
        /// RTMP or HTTP stream to YouTube.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ingestionInfo")]
        public virtual IngestionInfo IngestionInfo { get; set; } 

        /// <summary>The method or protocol used to transmit the video stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ingestionType")]
        public virtual string IngestionType { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A channel resource contains information about a YouTube channel.</summary>
    public class Channel : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The auditionDetails object encapsulates channel data that is relevant for YouTube Partners during
        /// the audition process.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("auditDetails")]
        public virtual ChannelAuditDetails AuditDetails { get; set; } 

        /// <summary>The brandingSettings object encapsulates information about the branding of the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("brandingSettings")]
        public virtual ChannelBrandingSettings BrandingSettings { get; set; } 

        /// <summary>The contentDetails object encapsulates information about the channel's content.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual ChannelContentDetails ContentDetails { get; set; } 

        /// <summary>The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners
        /// linked with the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentOwnerDetails")]
        public virtual ChannelContentOwnerDetails ContentOwnerDetails { get; set; } 

        /// <summary>The conversionPings object encapsulates information about conversion pings that need to be
        /// respected by the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("conversionPings")]
        public virtual ChannelConversionPings ConversionPings { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>The invideoPromotion object encapsulates information about promotion campaign associated with the
        /// channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("invideoPromotion")]
        public virtual InvideoPromotion InvideoPromotion { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#channel".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>Localizations for different languages</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localizations")]
        public virtual System.Collections.Generic.IDictionary<string,ChannelLocalization> Localizations { get; set; } 

        /// <summary>The snippet object contains basic details about the channel, such as its title, description, and
        /// thumbnail images.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual ChannelSnippet Snippet { get; set; } 

        /// <summary>The statistics object encapsulates statistics for the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("statistics")]
        public virtual ChannelStatistics Statistics { get; set; } 

        /// <summary>The status object encapsulates information about the privacy status of the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual ChannelStatus Status { get; set; } 

        /// <summary>The topicDetails object encapsulates information about Freebase topics associated with the
        /// channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("topicDetails")]
        public virtual ChannelTopicDetails TopicDetails { get; set; } 

    }    

    /// <summary>The auditDetails object encapsulates channel data that is relevant for YouTube Partners during the
    /// audit process.</summary>
    public class ChannelAuditDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Whether or not the channel respects the community guidelines.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("communityGuidelinesGoodStanding")]
        public virtual System.Nullable<bool> CommunityGuidelinesGoodStanding { get; set; } 

        /// <summary>Whether or not the channel has any unresolved claims.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentIdClaimsGoodStanding")]
        public virtual System.Nullable<bool> ContentIdClaimsGoodStanding { get; set; } 

        /// <summary>Whether or not the channel has any copyright strikes.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("copyrightStrikesGoodStanding")]
        public virtual System.Nullable<bool> CopyrightStrikesGoodStanding { get; set; } 

        /// <summary>Describes the general state of the channel. This field will always show if there are any issues
        /// whatsoever with the channel. Currently this field represents the result of the logical and operation over
        /// the community guidelines good standing, the copyright strikes good standing and the content ID claims good
        /// standing, but this may change in the future.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("overallGoodStanding")]
        public virtual System.Nullable<bool> OverallGoodStanding { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A channel banner returned as the response to a channel_banner.insert call.</summary>
    public class ChannelBannerResource : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#channelBannerResource".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The URL of this banner image.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("url")]
        public virtual string Url { get; set; } 

    }    

    /// <summary>Branding properties of a YouTube channel.</summary>
    public class ChannelBrandingSettings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Branding properties for the channel view.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channel")]
        public virtual ChannelSettings Channel { get; set; } 

        /// <summary>Additional experimental branding properties.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("hints")]
        public virtual System.Collections.Generic.IList<PropertyValue> Hints { get; set; } 

        /// <summary>Branding properties for branding images.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("image")]
        public virtual ImageSettings Image { get; set; } 

        /// <summary>Branding properties for the watch page.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("watch")]
        public virtual WatchSettings Watch { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about the content of a channel.</summary>
    public class ChannelContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The googlePlusUserId object identifies the Google+ profile ID associated with this
        /// channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("googlePlusUserId")]
        public virtual string GooglePlusUserId { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("relatedPlaylists")]
        public virtual ChannelContentDetails.RelatedPlaylistsData RelatedPlaylists { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
        

        public class RelatedPlaylistsData
        {
            /// <summary>The ID of the playlist that contains the channel"s favorite videos. Use the
            /// playlistItems.insert and  playlistItems.delete to add or remove items from that list.</summary>
            [Newtonsoft.Json.JsonPropertyAttribute("favorites")]
            public virtual string Favorites { get; set; } 

            /// <summary>The ID of the playlist that contains the channel"s liked videos. Use the   playlistItems.insert
            /// and  playlistItems.delete to add or remove items from that list.</summary>
            [Newtonsoft.Json.JsonPropertyAttribute("likes")]
            public virtual string Likes { get; set; } 

            /// <summary>The ID of the playlist that contains the channel"s uploaded videos. Use the  videos.insert
            /// method to upload new videos and the videos.delete method to delete previously uploaded videos.</summary>
            [Newtonsoft.Json.JsonPropertyAttribute("uploads")]
            public virtual string Uploads { get; set; } 

            /// <summary>The ID of the playlist that contains the channel"s watch history. Use the  playlistItems.insert
            /// and  playlistItems.delete to add or remove items from that list.</summary>
            [Newtonsoft.Json.JsonPropertyAttribute("watchHistory")]
            public virtual string WatchHistory { get; set; } 

            /// <summary>The ID of the playlist that contains the channel"s watch later playlist. Use the
            /// playlistItems.insert and  playlistItems.delete to add or remove items from that list.</summary>
            [Newtonsoft.Json.JsonPropertyAttribute("watchLater")]
            public virtual string WatchLater { get; set; } 

        }
    }    

    /// <summary>The contentOwnerDetails object encapsulates channel data that is relevant for YouTube Partners linked
    /// with the channel.</summary>
    public class ChannelContentOwnerDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID of the content owner linked to the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentOwner")]
        public virtual string ContentOwner { get; set; } 

        /// <summary>The date and time of when the channel was linked to the content owner. The value is specified in
        /// ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("timeLinked")]
        public virtual string TimeLinkedRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="TimeLinkedRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> TimeLinked
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(TimeLinkedRaw);
            }
            set
            {
                TimeLinkedRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which the
    /// app must fire the ping, and a url identifying the ping.</summary>
    public class ChannelConversionPing : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Defines the context of the ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("context")]
        public virtual string Context { get; set; } 

        /// <summary>The url (without the schema) that the player shall send the ping to. It's at caller's descretion to
        /// decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/
        /// viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D
        /// cview%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA=default The caller must append biscotti authentication (ms param in
        /// case of mobile, for example) to this ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("conversionUrl")]
        public virtual string ConversionUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The conversionPings object encapsulates information about conversion pings that need to be respected by
    /// the channel.</summary>
    public class ChannelConversionPings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Pings that the app shall fire (authenticated by biscotti cookie). Each ping has a context, in which
        /// the app must fire the ping, and a url identifying the ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("pings")]
        public virtual System.Collections.Generic.IList<ChannelConversionPing> Pings { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ChannelId : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual string Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ChannelListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of channels that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Channel> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#channelListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Channel localization setting</summary>
    public class ChannelLocalization : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The localized strings for channel's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The localized strings for channel's title, read-only.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ChannelSection : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object contains details about the channel section content, such as a list of
        /// playlists or channels featured in the section.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual ChannelSectionContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the channel section.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#channelSection".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>Localizations for different languages</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localizations")]
        public virtual System.Collections.Generic.IDictionary<string,ChannelSectionLocalization> Localizations { get; set; } 

        /// <summary>The snippet object contains basic details about the channel section, such as its type, style and
        /// title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual ChannelSectionSnippet Snippet { get; set; } 

    }    

    /// <summary>Details about a channelsection, including playlists and channels.</summary>
    public class ChannelSectionContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The channel ids for type multiple_channels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channels")]
        public virtual System.Collections.Generic.IList<string> Channels { get; set; } 

        /// <summary>The playlist ids for type single_playlist and multiple_playlists. For singlePlaylist, only one
        /// playlistId is allowed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlists")]
        public virtual System.Collections.Generic.IList<string> Playlists { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ChannelSectionListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of ChannelSections that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<ChannelSection> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#channelSectionListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>ChannelSection localization setting</summary>
    public class ChannelSectionLocalization : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The localized strings for channel section's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a channel section, including title, style and position.</summary>
    public class ChannelSectionSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the channel that published the channel
        /// section.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The language of the channel section's default title and description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual string DefaultLanguage { get; set; } 

        /// <summary>Localized title, read-only.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localized")]
        public virtual ChannelSectionLocalization Localized { get; set; } 

        /// <summary>The position of the channel section in the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("position")]
        public virtual System.Nullable<long> Position { get; set; } 

        /// <summary>The style of the channel section.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("style")]
        public virtual string Style { get; set; } 

        /// <summary>The channel section's title for multiple_playlists and multiple_channels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The type of the channel section.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Branding properties for the channel view.</summary>
    public class ChannelSettings : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual string DefaultLanguage { get; set; } 

        /// <summary>Which content tab users should see when viewing the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultTab")]
        public virtual string DefaultTab { get; set; } 

        /// <summary>Specifies the channel description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Title for the featured channels tab.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("featuredChannelsTitle")]
        public virtual string FeaturedChannelsTitle { get; set; } 

        /// <summary>The list of featured channels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("featuredChannelsUrls")]
        public virtual System.Collections.Generic.IList<string> FeaturedChannelsUrls { get; set; } 

        /// <summary>Lists keywords associated with the channel, comma-separated.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("keywords")]
        public virtual string Keywords { get; set; } 

        /// <summary>Whether user-submitted comments left on the channel page need to be approved by the channel owner
        /// to be publicly visible.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("moderateComments")]
        public virtual System.Nullable<bool> ModerateComments { get; set; } 

        /// <summary>A prominent color that can be rendered on this channel page.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("profileColor")]
        public virtual string ProfileColor { get; set; } 

        /// <summary>Whether the tab to browse the videos should be displayed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("showBrowseView")]
        public virtual System.Nullable<bool> ShowBrowseView { get; set; } 

        /// <summary>Whether related channels should be proposed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("showRelatedChannels")]
        public virtual System.Nullable<bool> ShowRelatedChannels { get; set; } 

        /// <summary>Specifies the channel title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ID for a Google Analytics account to track and measure traffic to the channels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("trackingAnalyticsAccountId")]
        public virtual string TrackingAnalyticsAccountId { get; set; } 

        /// <summary>The trailer of the channel, for users that are not subscribers.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("unsubscribedTrailer")]
        public virtual string UnsubscribedTrailer { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a channel, including title, description and thumbnails.</summary>
    public class ChannelSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The language of the channel's default title and description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual string DefaultLanguage { get; set; } 

        /// <summary>The description of the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Localized title and description, read-only.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localized")]
        public virtual ChannelLocalization Localized { get; set; } 

        /// <summary>The date and time that the channel was created. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>A map of thumbnail images associated with the channel. For each object in the map, the key is the
        /// name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The channel's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Statistics about a channel: number of subscribers, number of videos in the channel, etc.</summary>
    public class ChannelStatistics : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The number of comments for the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("commentCount")]
        public virtual System.Nullable<ulong> CommentCount { get; set; } 

        /// <summary>Whether or not the number of subscribers is shown for this user.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("hiddenSubscriberCount")]
        public virtual System.Nullable<bool> HiddenSubscriberCount { get; set; } 

        /// <summary>The number of subscribers that the channel has.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("subscriberCount")]
        public virtual System.Nullable<ulong> SubscriberCount { get; set; } 

        /// <summary>The number of videos uploaded to the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoCount")]
        public virtual System.Nullable<ulong> VideoCount { get; set; } 

        /// <summary>The number of times the channel has been viewed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("viewCount")]
        public virtual System.Nullable<ulong> ViewCount { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>JSON template for the status part of a channel.</summary>
    public class ChannelStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user
        /// doesn't have a public YouTube identity.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isLinked")]
        public virtual System.Nullable<bool> IsLinked { get; set; } 

        /// <summary>The long uploads status of this channel. See</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("longUploadsStatus")]
        public virtual string LongUploadsStatus { get; set; } 

        /// <summary>Privacy status of the channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("privacyStatus")]
        public virtual string PrivacyStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Freebase topic information related to the channel.</summary>
    public class ChannelTopicDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of Freebase topic IDs associated with the channel. You can retrieve information about each
        /// topic using the Freebase Topic API.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("topicIds")]
        public virtual System.Collections.Generic.IList<string> TopicIds { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A comment represents a single YouTube comment.</summary>
    public class Comment : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#comment".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual CommentSnippet Snippet { get; set; } 

    }    

    public class CommentListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of comments that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Comment> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#commentListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a comment, such as its author and text.</summary>
    public class CommentSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The id of the author's YouTube channel, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("authorChannelId")]
        public virtual ChannelId AuthorChannelId { get; set; } 

        /// <summary>Link to the author's YouTube channel, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("authorChannelUrl")]
        public virtual string AuthorChannelUrl { get; set; } 

        /// <summary>The name of the user who posted the comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("authorDisplayName")]
        public virtual string AuthorDisplayName { get; set; } 

        /// <summary>Link to the author's Google+ profile, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("authorGoogleplusProfileUrl")]
        public virtual string AuthorGoogleplusProfileUrl { get; set; } 

        /// <summary>The URL for the avatar of the user who posted the comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("authorProfileImageUrl")]
        public virtual string AuthorProfileImageUrl { get; set; } 

        /// <summary>Whether the current viewer can rate this comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("canRate")]
        public virtual System.Nullable<bool> CanRate { get; set; } 

        /// <summary>The id of the corresponding YouTube channel. In case of a channel comment this is the channel the
        /// comment refers to. In case of a video comment it's the video's channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The total number of likes this comment has received.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("likeCount")]
        public virtual System.Nullable<long> LikeCount { get; set; } 

        /// <summary>The comment's moderation status. Will not be set if the comments were requested through the id
        /// filter.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("moderationStatus")]
        public virtual string ModerationStatus { get; set; } 

        /// <summary>The unique id of the parent comment, only set for replies.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("parentId")]
        public virtual string ParentId { get; set; } 

        /// <summary>The date and time when the comment was orignally published. The value is specified in ISO 8601
        /// (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The comment's text. The format is either plain text or HTML dependent on what has been requested.
        /// Even the plain text representation may differ from the text originally posted in that it may replace video
        /// links with video titles etc.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("textDisplay")]
        public virtual string TextDisplay { get; set; } 

        /// <summary>The comment's original raw text as initially posted or last updated. The original text will only be
        /// returned if it is accessible to the viewer, which is only guaranteed if the viewer is the comment's
        /// author.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("textOriginal")]
        public virtual string TextOriginal { get; set; } 

        /// <summary>The date and time when was last updated . The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("updatedAt")]
        public virtual string UpdatedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="UpdatedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> UpdatedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(UpdatedAtRaw);
            }
            set
            {
                UpdatedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The ID of the video the comment refers to, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The rating the viewer has given to this comment. For the time being this will never return
        /// RATE_TYPE_DISLIKE and instead return RATE_TYPE_NONE. This may change in the future.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("viewerRating")]
        public virtual string ViewerRating { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A comment thread represents information that applies to a top level comment and all its replies. It can
    /// also include the top level comment itself and some of the replies.</summary>
    public class CommentThread : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the comment thread.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#commentThread".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The replies object contains a limited number of replies (if any) to the top level comment found in
        /// the snippet.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("replies")]
        public virtual CommentThreadReplies Replies { get; set; } 

        /// <summary>The snippet object contains basic details about the comment thread and also the top level
        /// comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual CommentThreadSnippet Snippet { get; set; } 

    }    

    public class CommentThreadListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of comment threads that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<CommentThread> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#commentThreadListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Comments written in (direct or indirect) reply to the top level comment.</summary>
    public class CommentThreadReplies : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A limited number of replies. Unless the number of replies returned equals total_reply_count in the
        /// snippet the returned replies are only a subset of the total number of replies.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("comments")]
        public virtual System.Collections.Generic.IList<Comment> Comments { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a comment thread.</summary>
    public class CommentThreadSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Whether the current viewer of the thread can reply to it. This is viewer specific - other viewers
        /// may see a different value for this field.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("canReply")]
        public virtual System.Nullable<bool> CanReply { get; set; } 

        /// <summary>The YouTube channel the comments in the thread refer to or the channel with the video the comments
        /// refer to. If video_id isn't set the comments refer to the channel itself.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Whether the thread (and therefore all its comments) is visible to all YouTube users.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isPublic")]
        public virtual System.Nullable<bool> IsPublic { get; set; } 

        /// <summary>The top level comment of this thread.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("topLevelComment")]
        public virtual Comment TopLevelComment { get; set; } 

        /// <summary>The total number of replies (not including the top level comment).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("totalReplyCount")]
        public virtual System.Nullable<long> TotalReplyCount { get; set; } 

        /// <summary>The ID of the video the comments refer to, if any. No video_id implies a channel discussion
        /// comment.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Ratings schemes. The country-specific ratings are mostly for movies and shows. NEXT_ID: 65</summary>
    public class ContentRating : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Rating system in Australia - Australian Classification Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("acbRating")]
        public virtual string AcbRating { get; set; } 

        /// <summary>Rating system for Italy - Autorit� per le Garanzie nelle Comunicazioni</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("agcomRating")]
        public virtual string AgcomRating { get; set; } 

        /// <summary>Rating system for Chile - Asociaci�n Nacional de Televisi�n</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("anatelRating")]
        public virtual string AnatelRating { get; set; } 

        /// <summary>British Board of Film Classification</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bbfcRating")]
        public virtual string BbfcRating { get; set; } 

        /// <summary>Rating system for Thailand - Board of Filmand Video Censors</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bfvcRating")]
        public virtual string BfvcRating { get; set; } 

        /// <summary>Rating system for Austria - Bundesministeriums f�r Unterricht, Kunst und Kultur!</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bmukkRating")]
        public virtual string BmukkRating { get; set; } 

        /// <summary>Rating system for Canadian TV - Canadian TV Classification System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("catvRating")]
        public virtual string CatvRating { get; set; } 

        /// <summary>Rating system for French Canadian TV - Regie du cinema</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("catvfrRating")]
        public virtual string CatvfrRating { get; set; } 

        /// <summary>Rating system in India - Central Board of Film Certification</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cbfcRating")]
        public virtual string CbfcRating { get; set; } 

        /// <summary>Rating system for Chile - Consejo de Calificaci�n Cinematogr�fica</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cccRating")]
        public virtual string CccRating { get; set; } 

        /// <summary>Rating system for Portugal - Comiss�o de Classifica��o de Espect�culos</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cceRating")]
        public virtual string CceRating { get; set; } 

        /// <summary>Rating system for Switzerland - Switzerland Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("chfilmRating")]
        public virtual string ChfilmRating { get; set; } 

        /// <summary>Canadian Home Video Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("chvrsRating")]
        public virtual string ChvrsRating { get; set; } 

        /// <summary>Rating system for Belgium - Belgium Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cicfRating")]
        public virtual string CicfRating { get; set; } 

        /// <summary>Rating system for Romania - CONSILIUL NATIONAL AL AUDIOVIZUALULUI - CNA</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cnaRating")]
        public virtual string CnaRating { get; set; } 

        /// <summary>Rating system for France - Conseil sup�rieur de l?audiovisuel</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("csaRating")]
        public virtual string CsaRating { get; set; } 

        /// <summary>Rating system for Luxembourg - Commission de surveillance de la classification des films</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cscfRating")]
        public virtual string CscfRating { get; set; } 

        /// <summary>Rating system for Czech republic - Czech republic Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("czfilmRating")]
        public virtual string CzfilmRating { get; set; } 

        /// <summary>Rating system in Brazil - Department of Justice, Rating, Titles and Qualification</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("djctqRating")]
        public virtual string DjctqRating { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("djctqRatingReasons")]
        public virtual System.Collections.Generic.IList<string> DjctqRatingReasons { get; set; } 

        /// <summary>Rating system for Estonia - Estonia Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eefilmRating")]
        public virtual string EefilmRating { get; set; } 

        /// <summary>Rating system for Egypt - Egypt Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("egfilmRating")]
        public virtual string EgfilmRating { get; set; } 

        /// <summary>Rating system in Japan - Eiga Rinri Kanri Iinkai</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eirinRating")]
        public virtual string EirinRating { get; set; } 

        /// <summary>Rating system for Malaysia - Film Censorship Board of Malaysia</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fcbmRating")]
        public virtual string FcbmRating { get; set; } 

        /// <summary>Rating system for Hong kong - Office for Film, Newspaper and Article Administration</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fcoRating")]
        public virtual string FcoRating { get; set; } 

        /// <summary>Rating system in France - French Minister of Culture</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fmocRating")]
        public virtual string FmocRating { get; set; } 

        /// <summary>Rating system for South africa - Film & Publication Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fpbRating")]
        public virtual string FpbRating { get; set; } 

        /// <summary>Rating system in Germany - Voluntary Self Regulation of the Movie Industry</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fskRating")]
        public virtual string FskRating { get; set; } 

        /// <summary>Rating system for Greece - Greece Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("grfilmRating")]
        public virtual string GrfilmRating { get; set; } 

        /// <summary>Rating system in Spain - Instituto de Cinematografia y de las Artes Audiovisuales</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("icaaRating")]
        public virtual string IcaaRating { get; set; } 

        /// <summary>Rating system in Ireland - Irish Film Classification Office</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ifcoRating")]
        public virtual string IfcoRating { get; set; } 

        /// <summary>Rating system for Israel - Israel Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ilfilmRating")]
        public virtual string IlfilmRating { get; set; } 

        /// <summary>Rating system for Argentina - Instituto Nacional de Cine y Artes Audiovisuales</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("incaaRating")]
        public virtual string IncaaRating { get; set; } 

        /// <summary>Rating system for Kenya - Kenya Film Classification Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kfcbRating")]
        public virtual string KfcbRating { get; set; } 

        /// <summary>Rating system for Netherlands - Nederlands Instituut voor de Classificatie van Audiovisuele
        /// Media</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kijkwijzerRating")]
        public virtual string KijkwijzerRating { get; set; } 

        /// <summary>Rating system in South Korea - Korea Media Rating Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kmrbRating")]
        public virtual string KmrbRating { get; set; } 

        /// <summary>Rating system for Indonesia - Lembaga Sensor Film</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("lsfRating")]
        public virtual string LsfRating { get; set; } 

        /// <summary>Rating system for Malta - Film Age-Classification Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mccaaRating")]
        public virtual string MccaaRating { get; set; } 

        /// <summary>Rating system for Denmark - The Media Council for Children and Young People</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mccypRating")]
        public virtual string MccypRating { get; set; } 

        /// <summary>Rating system for Singapore - Media Development Authority</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mdaRating")]
        public virtual string MdaRating { get; set; } 

        /// <summary>Rating system for Norway - Medietilsynet</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("medietilsynetRating")]
        public virtual string MedietilsynetRating { get; set; } 

        /// <summary>Rating system for Finland - Finnish Centre for Media Education and Audiovisual Media</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mekuRating")]
        public virtual string MekuRating { get; set; } 

        /// <summary>Rating system in Italy - Ministero dei Beni e delle Attivita Culturali e del Turismo</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mibacRating")]
        public virtual string MibacRating { get; set; } 

        /// <summary>Rating system for Colombia - MoC</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mocRating")]
        public virtual string MocRating { get; set; } 

        /// <summary>Rating system for Taiwan - Ministry of Culture - Tawan</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("moctwRating")]
        public virtual string MoctwRating { get; set; } 

        /// <summary>Motion Picture Association of America rating for the content.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mpaaRating")]
        public virtual string MpaaRating { get; set; } 

        /// <summary>Rating system for Philippines - MOVIE AND TELEVISION REVIEW AND CLASSIFICATION BOARD</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("mtrcbRating")]
        public virtual string MtrcbRating { get; set; } 

        /// <summary>Rating system for Maldives - National Bureau of Classification</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nbcRating")]
        public virtual string NbcRating { get; set; } 

        /// <summary>Rating system for Poland - National Broadcasting Council</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nbcplRating")]
        public virtual string NbcplRating { get; set; } 

        /// <summary>Rating system for Bulgaria - National Film Centre</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nfrcRating")]
        public virtual string NfrcRating { get; set; } 

        /// <summary>Rating system for Nigeria - National Film and Video Censors Board</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nfvcbRating")]
        public virtual string NfvcbRating { get; set; } 

        /// <summary>Rating system for Latvia - National Film Center of Latvia</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nkclvRating")]
        public virtual string NkclvRating { get; set; } 

        /// <summary>Rating system in New Zealand - Office of Film and Literature Classification</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("oflcRating")]
        public virtual string OflcRating { get; set; } 

        /// <summary>Rating system for Peru - Peru Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("pefilmRating")]
        public virtual string PefilmRating { get; set; } 

        /// <summary>Rating system for Hungary - Rating Committee of the National Office of Film</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rcnofRating")]
        public virtual string RcnofRating { get; set; } 

        /// <summary>Rating system for Venezuela - SiBCI</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resorteviolenciaRating")]
        public virtual string ResorteviolenciaRating { get; set; } 

        /// <summary>Rating system in Mexico - General Directorate of Radio, Television and Cinematography</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rtcRating")]
        public virtual string RtcRating { get; set; } 

        /// <summary>Rating system for Ireland - Raidi� Teilif�s �ireann</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rteRating")]
        public virtual string RteRating { get; set; } 

        /// <summary>Rating system in Russia</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("russiaRating")]
        public virtual string RussiaRating { get; set; } 

        /// <summary>Rating system for Slovakia - Slovakia Rating System</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("skfilmRating")]
        public virtual string SkfilmRating { get; set; } 

        /// <summary>Rating system for Iceland - SMAIS</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("smaisRating")]
        public virtual string SmaisRating { get; set; } 

        /// <summary>Rating system for Sweden - Statens medier�d (National Media Council)</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("smsaRating")]
        public virtual string SmsaRating { get; set; } 

        /// <summary>TV Parental Guidelines rating of the content.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tvpgRating")]
        public virtual string TvpgRating { get; set; } 

        /// <summary>Internal YouTube rating.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ytRating")]
        public virtual string YtRating { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Geographical coordinates of a point, in WGS84.</summary>
    public class GeoPoint : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Altitude above the reference ellipsoid, in meters.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("altitude")]
        public virtual System.Nullable<double> Altitude { get; set; } 

        /// <summary>Latitude in degrees.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("latitude")]
        public virtual System.Nullable<double> Latitude { get; set; } 

        /// <summary>Longitude in degrees.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("longitude")]
        public virtual System.Nullable<double> Longitude { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A guideCategory resource identifies a category that YouTube algorithmically assigns based on a
    /// channel's content or other indicators, such as the channel's popularity. The list is similar to video
    /// categories, with the difference being that a video's uploader can assign a video category but only YouTube can
    /// assign a channel category.</summary>
    public class GuideCategory : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the guide category.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#guideCategory".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the category, such as its title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual GuideCategorySnippet Snippet { get; set; } 

    }    

    public class GuideCategoryListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of categories that can be associated with YouTube channels. In this map, the category ID is
        /// the map key, and its value is the corresponding guideCategory resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<GuideCategory> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#guideCategoryListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a guide category.</summary>
    public class GuideCategorySnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Description of the guide category.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An i18nLanguage resource identifies a UI language currently supported by YouTube.</summary>
    public class I18nLanguage : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the i18n language.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#i18nLanguage".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the i18n language, such as language code and human-
        /// readable name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual I18nLanguageSnippet Snippet { get; set; } 

    }    

    public class I18nLanguageListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of supported i18n languages. In this map, the i18n language ID is the map key, and its value
        /// is the corresponding i18nLanguage resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<I18nLanguage> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#i18nLanguageListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about an i18n language, such as language code and human-readable name.</summary>
    public class I18nLanguageSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A short BCP-47 code that uniquely identifies a language.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("hl")]
        public virtual string Hl { get; set; } 

        /// <summary>The human-readable name of the language in the language itself.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A i18nRegion resource identifies a region where YouTube is available.</summary>
    public class I18nRegion : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the i18n region.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#i18nRegion".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the i18n region, such as region code and human-
        /// readable name.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual I18nRegionSnippet Snippet { get; set; } 

    }    

    public class I18nRegionListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of regions where YouTube is available. In this map, the i18n region ID is the map key, and
        /// its value is the corresponding i18nRegion resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<I18nRegion> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#i18nRegionListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about an i18n region, such as region code and human-readable name.</summary>
    public class I18nRegionSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The region code as a 2-letter ISO country code.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("gl")]
        public virtual string Gl { get; set; } 

        /// <summary>The human-readable name of the region.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Branding properties for images associated with the channel.</summary>
    public class ImageSettings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The URL for the background image shown on the video watch page. The image should be 1200px by
        /// 615px, with a maximum file size of 128k.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("backgroundImageUrl")]
        public virtual LocalizedProperty BackgroundImageUrl { get; set; } 

        /// <summary>This is used only in update requests; if it's set, we use this URL to generate all of the above
        /// banner URLs.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerExternalUrl")]
        public virtual string BannerExternalUrl { get; set; } 

        /// <summary>Banner image. Desktop size (1060x175).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerImageUrl")]
        public virtual string BannerImageUrl { get; set; } 

        /// <summary>Banner image. Mobile size high resolution (1440x395).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerMobileExtraHdImageUrl")]
        public virtual string BannerMobileExtraHdImageUrl { get; set; } 

        /// <summary>Banner image. Mobile size high resolution (1280x360).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerMobileHdImageUrl")]
        public virtual string BannerMobileHdImageUrl { get; set; } 

        /// <summary>Banner image. Mobile size (640x175).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerMobileImageUrl")]
        public virtual string BannerMobileImageUrl { get; set; } 

        /// <summary>Banner image. Mobile size low resolution (320x88).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerMobileLowImageUrl")]
        public virtual string BannerMobileLowImageUrl { get; set; } 

        /// <summary>Banner image. Mobile size medium/high resolution (960x263).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerMobileMediumHdImageUrl")]
        public virtual string BannerMobileMediumHdImageUrl { get; set; } 

        /// <summary>Banner image. Tablet size extra high resolution (2560x424).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTabletExtraHdImageUrl")]
        public virtual string BannerTabletExtraHdImageUrl { get; set; } 

        /// <summary>Banner image. Tablet size high resolution (2276x377).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTabletHdImageUrl")]
        public virtual string BannerTabletHdImageUrl { get; set; } 

        /// <summary>Banner image. Tablet size (1707x283).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTabletImageUrl")]
        public virtual string BannerTabletImageUrl { get; set; } 

        /// <summary>Banner image. Tablet size low resolution (1138x188).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTabletLowImageUrl")]
        public virtual string BannerTabletLowImageUrl { get; set; } 

        /// <summary>Banner image. TV size high resolution (1920x1080).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTvHighImageUrl")]
        public virtual string BannerTvHighImageUrl { get; set; } 

        /// <summary>Banner image. TV size extra high resolution (2120x1192).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTvImageUrl")]
        public virtual string BannerTvImageUrl { get; set; } 

        /// <summary>Banner image. TV size low resolution (854x480).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTvLowImageUrl")]
        public virtual string BannerTvLowImageUrl { get; set; } 

        /// <summary>Banner image. TV size medium resolution (1280x720).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bannerTvMediumImageUrl")]
        public virtual string BannerTvMediumImageUrl { get; set; } 

        /// <summary>The image map script for the large banner image.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("largeBrandedBannerImageImapScript")]
        public virtual LocalizedProperty LargeBrandedBannerImageImapScript { get; set; } 

        /// <summary>The URL for the 854px by 70px image that appears below the video player in the expanded video view
        /// of the video watch page.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("largeBrandedBannerImageUrl")]
        public virtual LocalizedProperty LargeBrandedBannerImageUrl { get; set; } 

        /// <summary>The image map script for the small banner image.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("smallBrandedBannerImageImapScript")]
        public virtual LocalizedProperty SmallBrandedBannerImageImapScript { get; set; } 

        /// <summary>The URL for the 640px by 70px banner image that appears below the video player in the default view
        /// of the video watch page.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("smallBrandedBannerImageUrl")]
        public virtual LocalizedProperty SmallBrandedBannerImageUrl { get; set; } 

        /// <summary>The URL for a 1px by 1px tracking pixel that can be used to collect statistics for views of the
        /// channel or video pages.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("trackingImageUrl")]
        public virtual string TrackingImageUrl { get; set; } 

        /// <summary>The URL for the image that appears above the top-left corner of the video player. This is a 25
        /// -pixel-high image with a flexible width that cannot exceed 170 pixels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("watchIconImageUrl")]
        public virtual string WatchIconImageUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes information necessary for ingesting an RTMP or an HTTP stream.</summary>
    public class IngestionInfo : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The backup ingestion URL that you should use to stream video to YouTube. You have the option of
        /// simultaneously streaming the content that you are sending to the ingestionAddress to this URL.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("backupIngestionAddress")]
        public virtual string BackupIngestionAddress { get; set; } 

        /// <summary>The primary ingestion URL that you should use to stream video to YouTube. You must stream video to
        /// this URL.
        ///
        /// Depending on which application or tool you use to encode your video stream, you may need to enter the stream
        /// URL and stream name separately or you may need to concatenate them in the following format:
        ///
        /// STREAM_URL/STREAM_NAME</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ingestionAddress")]
        public virtual string IngestionAddress { get; set; } 

        /// <summary>The HTTP or RTMP stream name that YouTube assigns to the video stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("streamName")]
        public virtual string StreamName { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class InvideoBranding : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("imageBytes")]
        public virtual string ImageBytes { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("imageUrl")]
        public virtual string ImageUrl { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("position")]
        public virtual InvideoPosition Position { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("targetChannelId")]
        public virtual string TargetChannelId { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("timing")]
        public virtual InvideoTiming Timing { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes the spatial position of a visual widget inside a video. It is a union of various position
    /// types, out of which only will be set one.</summary>
    public class InvideoPosition : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Describes in which corner of the video the visual widget will appear.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cornerPosition")]
        public virtual string CornerPosition { get; set; } 

        /// <summary>Defines the position type.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes an invideo promotion campaign consisting of multiple promoted items. A campaign belongs to a
    /// single channel_id.</summary>
    public class InvideoPromotion : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The default temporal position within the video where the promoted item will be displayed. Can be
        /// overriden by more specific timing in the item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultTiming")]
        public virtual InvideoTiming DefaultTiming { get; set; } 

        /// <summary>List of promoted items in decreasing priority.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<PromotedItem> Items { get; set; } 

        /// <summary>The spatial position within the video where the promoted item will be displayed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("position")]
        public virtual InvideoPosition Position { get; set; } 

        /// <summary>Indicates whether the channel's promotional campaign uses "smart timing." This feature attempts to
        /// show promotions at a point in the video when they are more likely to be clicked and less likely to disrupt
        /// the viewing experience. This feature also picks up a single promotion to show on each video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("useSmartTiming")]
        public virtual System.Nullable<bool> UseSmartTiming { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes a temporal position of a visual widget inside a video.</summary>
    public class InvideoTiming : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Defines the duration in milliseconds for which the promotion should be displayed. If missing, the
        /// client should use the default.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("durationMs")]
        public virtual System.Nullable<ulong> DurationMs { get; set; } 

        /// <summary>Defines the time at which the promotion will appear. Depending on the value of type the value of
        /// the offsetMs field will represent a time offset from the start or from the end of the video, expressed in
        /// milliseconds.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("offsetMs")]
        public virtual System.Nullable<ulong> OffsetMs { get; set; } 

        /// <summary>Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an
        /// offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an
        /// offset from the end of the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LanguageTag : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual string Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A liveBroadcast resource represents an event that will be streamed, via live video, on
    /// YouTube.</summary>
    public class LiveBroadcast : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object contains information about the event's video content, such as whether the
        /// content can be shown in an embedded video player or if it will be archived and therefore available for
        /// viewing after the event has concluded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual LiveBroadcastContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube assigns to uniquely identify the broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#liveBroadcast".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the event, including its title, description, start
        /// time, and end time.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual LiveBroadcastSnippet Snippet { get; set; } 

        /// <summary>The status object contains information about the event's status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual LiveBroadcastStatus Status { get; set; } 

    }    

    /// <summary>Detailed settings of a broadcast.</summary>
    public class LiveBroadcastContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>This value uniquely identifies the live stream bound to the broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("boundStreamId")]
        public virtual string BoundStreamId { get; set; } 

        /// <summary>This setting indicates whether closed captioning is enabled for this broadcast. The ingestion URL
        /// of the closed captions is returned through the liveStreams API.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("enableClosedCaptions")]
        public virtual System.Nullable<bool> EnableClosedCaptions { get; set; } 

        /// <summary>This setting indicates whether YouTube should enable content encryption for the
        /// broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("enableContentEncryption")]
        public virtual System.Nullable<bool> EnableContentEncryption { get; set; } 

        /// <summary>This setting determines whether viewers can access DVR controls while watching the video. DVR
        /// controls enable the viewer to control the video playback experience by pausing, rewinding, or fast
        /// forwarding content. The default value for this property is true.
        ///
        /// Important: You must set the value to true and also set the enableArchive property's value to true if you
        /// want to make playback available immediately after the broadcast ends.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("enableDvr")]
        public virtual System.Nullable<bool> EnableDvr { get; set; } 

        /// <summary>This setting indicates whether the broadcast video can be played in an embedded player. If you
        /// choose to archive the video (using the enableArchive property), this setting will also apply to the archived
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("enableEmbed")]
        public virtual System.Nullable<bool> EnableEmbed { get; set; } 

        /// <summary>The monitorStream object contains information about the monitor stream, which the broadcaster can
        /// use to review the event content before the broadcast stream is shown publicly.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("monitorStream")]
        public virtual MonitorStreamInfo MonitorStream { get; set; } 

        /// <summary>Automatically start recording after the event goes live. The default value for this property is
        /// true.
        ///
        /// Important: You must also set the enableDvr property's value to true if you want the playback to be available
        /// immediately after the broadcast ends. If you set this property's value to true but do not also set the
        /// enableDvr property to true, there may be a delay of around one day before the archived video will be
        /// available for playback.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recordFromStart")]
        public virtual System.Nullable<bool> RecordFromStart { get; set; } 

        /// <summary>This setting indicates whether the broadcast should automatically begin with an in-stream slate
        /// when you update the broadcast's status to live. After updating the status, you then need to send a
        /// liveCuepoints.insert request that sets the cuepoint's eventState to end to remove the in-stream slate and
        /// make your broadcast stream visible to viewers.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startWithSlate")]
        public virtual System.Nullable<bool> StartWithSlate { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LiveBroadcastListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of broadcasts that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<LiveBroadcast> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#liveBroadcastListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    public class LiveBroadcastSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The date and time that the broadcast actually ended. This information is only available once the
        /// broadcast's state is complete. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("actualEndTime")]
        public virtual string ActualEndTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ActualEndTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ActualEndTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ActualEndTimeRaw);
            }
            set
            {
                ActualEndTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The date and time that the broadcast actually started. This information is only available once the
        /// broadcast's state is live. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("actualStartTime")]
        public virtual string ActualStartTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ActualStartTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ActualStartTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ActualStartTimeRaw);
            }
            set
            {
                ActualStartTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The ID that YouTube uses to uniquely identify the channel that is publishing the
        /// broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The broadcast's description. As with the title, you can set this field by modifying the broadcast
        /// resource or by setting the description field of the corresponding video resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The date and time that the broadcast was added to YouTube's live broadcast schedule. The value is
        /// specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The date and time that the broadcast is scheduled to end. The value is specified in ISO 8601 (YYYY-
        /// MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduledEndTime")]
        public virtual string ScheduledEndTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ScheduledEndTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ScheduledEndTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ScheduledEndTimeRaw);
            }
            set
            {
                ScheduledEndTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The date and time that the broadcast is scheduled to start. The value is specified in ISO 8601
        /// (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduledStartTime")]
        public virtual string ScheduledStartTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ScheduledStartTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ScheduledStartTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ScheduledStartTimeRaw);
            }
            set
            {
                ScheduledStartTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>A map of thumbnail images associated with the broadcast. For each nested object in this object, the
        /// key is the name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The broadcast's title. Note that the broadcast represents exactly one YouTube video. You can set
        /// this field by modifying the broadcast resource or by setting the title field of the corresponding video
        /// resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LiveBroadcastStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The broadcast's status. The status can be updated using the API's liveBroadcasts.transition
        /// method.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("lifeCycleStatus")]
        public virtual string LifeCycleStatus { get; set; } 

        /// <summary>Priority of the live broadcast event (internal state).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("liveBroadcastPriority")]
        public virtual string LiveBroadcastPriority { get; set; } 

        /// <summary>The broadcast's privacy status. Note that the broadcast represents exactly one YouTube video, so
        /// the privacy settings are identical to those supported for videos. In addition, you can set this field by
        /// modifying the broadcast resource or by setting the privacyStatus field of the corresponding video
        /// resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("privacyStatus")]
        public virtual string PrivacyStatus { get; set; } 

        /// <summary>The broadcast's recording status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recordingStatus")]
        public virtual string RecordingStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A live stream describes a live ingestion point.</summary>
    public class LiveStream : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The cdn object defines the live stream's content delivery network (CDN) settings. These settings
        /// provide details about the manner in which you stream your content to YouTube.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("cdn")]
        public virtual CdnSettings Cdn { get; set; } 

        /// <summary>The content_details object contains information about the stream, including the closed captions
        /// ingestion URL.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual LiveStreamContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube assigns to uniquely identify the stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#liveStream".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the stream, including its channel, title, and
        /// description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual LiveStreamSnippet Snippet { get; set; } 

        /// <summary>The status object contains information about live stream's status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual LiveStreamStatus Status { get; set; } 

    }    

    /// <summary>Detailed settings of a stream.</summary>
    public class LiveStreamContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ingestion URL where the closed captions of this stream are sent.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("closedCaptionsIngestionUrl")]
        public virtual string ClosedCaptionsIngestionUrl { get; set; } 

        /// <summary>Indicates whether the stream is reusable, which means that it can be bound to multiple broadcasts.
        /// It is common for broadcasters to reuse the same stream for many different broadcasts if those broadcasts
        /// occur at different times.
        ///
        /// If you set this value to false, then the stream will not be reusable, which means that it can only be bound
        /// to one broadcast. Non-reusable streams differ from reusable streams in the following ways: - A non-reusable
        /// stream can only be bound to one broadcast. - A non-reusable stream might be deleted by an automated process
        /// after the broadcast ends. - The  liveStreams.list method does not list non-reusable streams if you call the
        /// method and set the mine parameter to true. The only way to use that method to retrieve the resource for a
        /// non-reusable stream is to use the id parameter to identify the stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("isReusable")]
        public virtual System.Nullable<bool> IsReusable { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LiveStreamListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of live streams that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<LiveStream> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#liveStreamListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    public class LiveStreamSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the channel that is transmitting the
        /// stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The stream's description. The value cannot be longer than 10000 characters.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The date and time that the stream was created. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The stream's title. The value must be between 1 and 128 characters long.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Brief description of the live stream status.</summary>
    public class LiveStreamStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("streamStatus")]
        public virtual string StreamStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LocalizedProperty : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("default")]
        public virtual string Default { get; set; } 

        /// <summary>The language of the default property.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual LanguageTag DefaultLanguage { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("localized")]
        public virtual System.Collections.Generic.IList<LocalizedString> Localized { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class LocalizedString : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("language")]
        public virtual string Language { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual string Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Settings and Info of the monitor stream</summary>
    public class MonitorStreamInfo : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If you have set the enableMonitorStream property to true, then this property determines the length
        /// of the live broadcast delay.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("broadcastStreamDelayMs")]
        public virtual System.Nullable<long> BroadcastStreamDelayMs { get; set; } 

        /// <summary>HTML code that embeds a player that plays the monitor stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("embedHtml")]
        public virtual string EmbedHtml { get; set; } 

        /// <summary>This value determines whether the monitor stream is enabled for the broadcast. If the monitor
        /// stream is enabled, then YouTube will broadcast the event content on a special stream intended only for the
        /// broadcaster's consumption. The broadcaster can use the stream to review the event content and also to
        /// identify the optimal times to insert cuepoints.
        ///
        /// You need to set this value to true if you intend to have a broadcast delay for your event.
        ///
        /// Note: This property cannot be updated once the broadcast is in the testing or live state.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("enableMonitorStream")]
        public virtual System.Nullable<bool> EnableMonitorStream { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Paging details for lists of resources, including total number of items available and number of
    /// resources returned in a single page.</summary>
    public class PageInfo : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The number of results included in the API response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resultsPerPage")]
        public virtual System.Nullable<int> ResultsPerPage { get; set; } 

        /// <summary>The total number of results in the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("totalResults")]
        public virtual System.Nullable<int> TotalResults { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A playlist resource represents a YouTube playlist. A playlist is a collection of videos that can be
    /// viewed sequentially and shared with other users. A playlist can contain up to 200 videos, and YouTube does not
    /// limit the number of playlists that each user creates. By default, playlists are publicly visible to other users,
    /// but playlists can be public or private.
    ///
    /// YouTube also uses playlists to identify special collections of videos for a channel, such as: - uploaded videos
    /// - favorite videos - positively rated (liked) videos - watch history - watch later  To be more specific, these
    /// lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists,
    /// and other YouTube information. You can retrieve the playlist IDs for each of these lists from the  channel
    /// resource for a given channel.
    ///
    /// You can then use the   playlistItems.list method to retrieve any of those lists. You can also add or remove
    /// items from those lists by calling the   playlistItems.insert and   playlistItems.delete methods.</summary>
    public class Playlist : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object contains information like video count.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual PlaylistContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#playlist".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>Localizations for different languages</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localizations")]
        public virtual System.Collections.Generic.IDictionary<string,PlaylistLocalization> Localizations { get; set; } 

        /// <summary>The player object contains information that you would use to play the playlist in an embedded
        /// player.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("player")]
        public virtual PlaylistPlayer Player { get; set; } 

        /// <summary>The snippet object contains basic details about the playlist, such as its title and
        /// description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual PlaylistSnippet Snippet { get; set; } 

        /// <summary>The status object contains status information for the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual PlaylistStatus Status { get; set; } 

    }    

    public class PlaylistContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The number of videos in the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("itemCount")]
        public virtual System.Nullable<long> ItemCount { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A playlistItem resource identifies another resource, such as a video, that is included in a playlist.
    /// In addition, the playlistItem  resource contains details about the included resource that pertain specifically
    /// to how that resource is used in that playlist.
    ///
    /// YouTube uses playlists to identify special collections of videos for a channel, such as: - uploaded videos -
    /// favorite videos - positively rated (liked) videos - watch history - watch later  To be more specific, these
    /// lists are associated with a channel, which is a collection of a person, group, or company's videos, playlists,
    /// and other YouTube information.
    ///
    /// You can retrieve the playlist IDs for each of these lists from the  channel resource  for a given channel. You
    /// can then use the   playlistItems.list method to retrieve any of those lists. You can also add or remove items
    /// from those lists by calling the   playlistItems.insert and   playlistItems.delete methods. For example, if a
    /// user gives a positive rating to a video, you would insert that video into the liked videos playlist for that
    /// user's channel.</summary>
    public class PlaylistItem : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object is included in the resource if the included item is a YouTube video. The
        /// object contains additional information about the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual PlaylistItemContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the playlist item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#playlistItem".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the playlist item, such as its title and position
        /// in the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual PlaylistItemSnippet Snippet { get; set; } 

        /// <summary>The status object contains information about the playlist item's privacy status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual PlaylistItemStatus Status { get; set; } 

    }    

    public class PlaylistItemContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The time, measured in seconds from the start of the video, when the video should stop playing. (The
        /// playlist owner can specify the times when the video should start and stop playing when the video is played
        /// in the context of the playlist.) By default, assume that the video.endTime is the end of the
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endAt")]
        public virtual string EndAt { get; set; } 

        /// <summary>A user-generated note for this item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("note")]
        public virtual string Note { get; set; } 

        /// <summary>The time, measured in seconds from the start of the video, when the video should start playing.
        /// (The playlist owner can specify the times when the video should start and stop playing when the video is
        /// played in the context of the playlist.) The default value is 0.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startAt")]
        public virtual string StartAt { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify a video. To retrieve the video resource, set the id
        /// query parameter to this value in your API request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class PlaylistItemListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of playlist items that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<PlaylistItem> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#playlistItemListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a playlist, including title, description and thumbnails.</summary>
    public class PlaylistItemSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the user that added the item to the
        /// playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Channel title for the channel that the playlist item belongs to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>The item's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the playlist that the playlist item is in.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlistId")]
        public virtual string PlaylistId { get; set; } 

        /// <summary>The order in which the item appears in the playlist. The value uses a zero-based index, so the
        /// first item has a position of 0, the second item has a position of 1, and so forth.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("position")]
        public virtual System.Nullable<long> Position { get; set; } 

        /// <summary>The date and time that the item was added to the playlist. The value is specified in ISO 8601
        /// (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The id object contains information that can be used to uniquely identify the resource that is
        /// included in the playlist as the playlist item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>A map of thumbnail images associated with the playlist item. For each object in the map, the key is
        /// the name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The item's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about the playlist item's privacy status.</summary>
    public class PlaylistItemStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>This resource's privacy status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("privacyStatus")]
        public virtual string PrivacyStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class PlaylistListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of playlists that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Playlist> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#playlistListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Playlist localization setting</summary>
    public class PlaylistLocalization : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The localized strings for playlist's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The localized strings for playlist's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class PlaylistPlayer : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>An  tag that embeds a player that will play the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("embedHtml")]
        public virtual string EmbedHtml { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a playlist, including title, description and thumbnails.</summary>
    public class PlaylistSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the channel that published the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The channel title of the channel that the video belongs to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>The language of the playlist's default title and description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual string DefaultLanguage { get; set; } 

        /// <summary>The playlist's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Localized title and description, read-only.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localized")]
        public virtual PlaylistLocalization Localized { get; set; } 

        /// <summary>The date and time that the playlist was created. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>Keyword tags associated with the playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tags")]
        public virtual System.Collections.Generic.IList<string> Tags { get; set; } 

        /// <summary>A map of thumbnail images associated with the playlist. For each object in the map, the key is the
        /// name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The playlist's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class PlaylistStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The playlist's privacy status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("privacyStatus")]
        public virtual string PrivacyStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes a single promoted item.</summary>
    public class PromotedItem : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A custom message to display for this promotion. This field is currently ignored unless the promoted
        /// item is a website.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("customMessage")]
        public virtual string CustomMessage { get; set; } 

        /// <summary>Identifies the promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual PromotedItemId Id { get; set; } 

        /// <summary>If true, the content owner's name will be used when displaying the promotion. This field can only
        /// be set when the update is made on behalf of the content owner.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("promotedByContentOwner")]
        public virtual System.Nullable<bool> PromotedByContentOwner { get; set; } 

        /// <summary>The temporal position within the video where the promoted item will be displayed. If present, it
        /// overrides the default timing.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("timing")]
        public virtual InvideoTiming Timing { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes a single promoted item id. It is a union of various possible types.</summary>
    public class PromotedItemId : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If type is recentUpload, this field identifies the channel from which to take the recent upload. If
        /// missing, the channel is assumed to be the same channel for which the invideoPromotion is set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recentlyUploadedBy")]
        public virtual string RecentlyUploadedBy { get; set; } 

        /// <summary>Describes the type of the promoted item.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("type")]
        public virtual string Type { get; set; } 

        /// <summary>If the promoted item represents a video, this field represents the unique YouTube ID identifying
        /// it. This field will be present only if type has the value video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>If the promoted item represents a website, this field represents the url pointing to the website.
        /// This field will be present only if type has the value website.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("websiteUrl")]
        public virtual string WebsiteUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A pair Property / Value.</summary>
    public class PropertyValue : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A property.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("property")]
        public virtual string Property { get; set; } 

        /// <summary>The property's value.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("value")]
        public virtual string Value { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A resource id is a generic reference that points to another YouTube resource.</summary>
    public class ResourceId : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the referred resource, if that resource is a channel.
        /// This property is only present if the resourceId.kind value is youtube#channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The type of the API resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the referred resource, if that resource is a
        /// playlist. This property is only present if the resourceId.kind value is youtube#playlist.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("playlistId")]
        public virtual string PlaylistId { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the referred resource, if that resource is a video.
        /// This property is only present if the resourceId.kind value is youtube#video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class SearchListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of results that match the search criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<SearchResult> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#searchListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>A search result contains information about a YouTube video, channel, or playlist that matches the
    /// search parameters specified in an API request. While a search result points to a uniquely identifiable resource,
    /// like a video, it does not have its own persistent data.</summary>
    public class SearchResult : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The id object contains information that can be used to uniquely identify the resource that matches
        /// the search request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual ResourceId Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#searchResult".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about a search result, such as its title or description.
        /// For example, if the search result is a video, then the title will be the video's title and the description
        /// will be the video's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual SearchResultSnippet Snippet { get; set; } 

    }    

    /// <summary>Basic details about a search result, including title, description and thumbnails of the item referenced
    /// by the search result.</summary>
    public class SearchResultSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The value that YouTube uses to uniquely identify the channel that published the resource that the
        /// search result identifies.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The title of the channel that published the resource that the search result identifies.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>A description of the search result.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>It indicates if the resource (video or channel) has upcoming/active live broadcast content. Or it's
        /// "none" if there is not any upcoming/active live broadcasts.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("liveBroadcastContent")]
        public virtual string LiveBroadcastContent { get; set; } 

        /// <summary>The creation date and time of the resource that the search result identifies. The value is
        /// specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>A map of thumbnail images associated with the search result. For each object in the map, the key is
        /// the name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The title of the search result.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A subscription resource contains information about a YouTube user subscription. A subscription notifies
    /// a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such
    /// as uploading a video, rating a video, or commenting on a video.</summary>
    public class Subscription : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The contentDetails object contains basic statistics about the subscription.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual SubscriptionContentDetails ContentDetails { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the subscription.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#subscription".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the subscription, including its title and the
        /// channel that the user subscribed to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual SubscriptionSnippet Snippet { get; set; } 

        /// <summary>The subscriberSnippet object contains basic details about the sbuscriber.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("subscriberSnippet")]
        public virtual SubscriptionSubscriberSnippet SubscriberSnippet { get; set; } 

    }    

    /// <summary>Details about the content to witch a subscription refers.</summary>
    public class SubscriptionContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The type of activity this subscription is for (only uploads, everything).</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("activityType")]
        public virtual string ActivityType { get; set; } 

        /// <summary>The number of new items in the subscription since its content was last read.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("newItemCount")]
        public virtual System.Nullable<long> NewItemCount { get; set; } 

        /// <summary>The approximate number of items that the subscription points to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("totalItemCount")]
        public virtual System.Nullable<long> TotalItemCount { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class SubscriptionListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of subscriptions that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Subscription> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#subscriptionListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a subscription, including title, description and thumbnails of the subscribed
    /// item.</summary>
    public class SubscriptionSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID that YouTube uses to uniquely identify the subscriber's channel.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Channel title for the channel that the subscription belongs to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>The subscription's details.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>The date and time that the subscription was created. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The id object contains information about the channel that the user subscribed to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("resourceId")]
        public virtual ResourceId ResourceId { get; set; } 

        /// <summary>A map of thumbnail images associated with the video. For each object in the map, the key is the
        /// name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The subscription's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a subscription's subscriber including title, description, channel ID and
    /// thumbnails.</summary>
    public class SubscriptionSubscriberSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The channel ID of the subscriber.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The description of the subscriber.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Thumbnails for this subscriber.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The title of the subscriber.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A thumbnail is an image representing a YouTube resource.</summary>
    public class Thumbnail : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>(Optional) Height of the thumbnail image.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("height")]
        public virtual System.Nullable<long> Height { get; set; } 

        /// <summary>The thumbnail image's URL.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("url")]
        public virtual string Url { get; set; } 

        /// <summary>(Optional) Width of the thumbnail image.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("width")]
        public virtual System.Nullable<long> Width { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Internal representation of thumbnails for a YouTube resource.</summary>
    public class ThumbnailDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The default image for this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("default")]
        public virtual Thumbnail Default { get; set; } 

        /// <summary>The high quality image for this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("high")]
        public virtual Thumbnail High { get; set; } 

        /// <summary>The maximum resolution quality image for this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("maxres")]
        public virtual Thumbnail Maxres { get; set; } 

        /// <summary>The medium quality image for this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("medium")]
        public virtual Thumbnail Medium { get; set; } 

        /// <summary>The standard quality image for this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("standard")]
        public virtual Thumbnail Standard { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class ThumbnailSetResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of thumbnails.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<ThumbnailDetails> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#thumbnailSetResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Stub token pagination template to suppress results.</summary>
    public class TokenPagination : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A video resource represents a YouTube video.</summary>
    public class Video : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Age restriction details related to a video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("ageGating")]
        public virtual VideoAgeGating AgeGating { get; set; } 

        /// <summary>The contentDetails object contains information about the video content, including the length of the
        /// video and its aspect ratio.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentDetails")]
        public virtual VideoContentDetails ContentDetails { get; set; } 

        /// <summary>The conversionPings object encapsulates information about url pings that need to be respected by
        /// the App in different video contexts.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("conversionPings")]
        public virtual VideoConversionPings ConversionPings { get; set; } 

        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The fileDetails object encapsulates information about the video file that was uploaded to YouTube,
        /// including the file's resolution, duration, audio and video codecs, stream bitrates, and more. This data can
        /// only be retrieved by the video owner.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileDetails")]
        public virtual VideoFileDetails FileDetails { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string "youtube#video".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The liveStreamingDetails object contains metadata about a live video broadcast. The object will
        /// only be present in a video resource if the video is an upcoming, live, or completed live
        /// broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("liveStreamingDetails")]
        public virtual VideoLiveStreamingDetails LiveStreamingDetails { get; set; } 

        /// <summary>List with all localizations.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localizations")]
        public virtual System.Collections.Generic.IDictionary<string,VideoLocalization> Localizations { get; set; } 

        /// <summary>The monetizationDetails object encapsulates information about the monetization status of the
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("monetizationDetails")]
        public virtual VideoMonetizationDetails MonetizationDetails { get; set; } 

        /// <summary>The player object contains information that you would use to play the video in an embedded
        /// player.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("player")]
        public virtual VideoPlayer Player { get; set; } 

        /// <summary>The processingProgress object encapsulates information about YouTube's progress in processing the
        /// uploaded video file. The properties in the object identify the current processing status and an estimate of
        /// the time remaining until YouTube finishes processing the video. This part also indicates whether different
        /// types of data or content, such as file details or thumbnail images, are available for the video.
        ///
        /// The processingProgress object is designed to be polled so that the video uploaded can track the progress
        /// that YouTube has made in processing the uploaded video file. This data can only be retrieved by the video
        /// owner.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingDetails")]
        public virtual VideoProcessingDetails ProcessingDetails { get; set; } 

        /// <summary>The projectDetails object contains information about the project specific video metadata.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("projectDetails")]
        public virtual VideoProjectDetails ProjectDetails { get; set; } 

        /// <summary>The recordingDetails object encapsulates information about the location, date and address where the
        /// video was recorded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recordingDetails")]
        public virtual VideoRecordingDetails RecordingDetails { get; set; } 

        /// <summary>The snippet object contains basic details about the video, such as its title, description, and
        /// category.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual VideoSnippet Snippet { get; set; } 

        /// <summary>The statistics object contains statistics about the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("statistics")]
        public virtual VideoStatistics Statistics { get; set; } 

        /// <summary>The status object contains information about the video's uploading, processing, and privacy
        /// statuses.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual VideoStatus Status { get; set; } 

        /// <summary>The suggestions object encapsulates suggestions that identify opportunities to improve the video
        /// quality or the metadata for the uploaded video. This data can only be retrieved by the video
        /// owner.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("suggestions")]
        public virtual VideoSuggestions Suggestions { get; set; } 

        /// <summary>The topicDetails object encapsulates information about Freebase topics associated with the
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("topicDetails")]
        public virtual VideoTopicDetails TopicDetails { get; set; } 

    }    

    public class VideoAgeGating : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Indicates whether or not the video has alcoholic beverage content. Only users of legal purchasing
        /// age in a particular country, as identified by ICAP, can view the content.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("alcoholContent")]
        public virtual System.Nullable<bool> AlcoholContent { get; set; } 

        /// <summary>Age-restricted trailers. For redband trailers and adult-rated video-games. Only users aged 18+ can
        /// view the content. The the field is true the content is restricted to viewers aged 18+. Otherwise The field
        /// won't be present.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("restricted")]
        public virtual System.Nullable<bool> Restricted { get; set; } 

        /// <summary>Video game rating, if any.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoGameRating")]
        public virtual string VideoGameRating { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A videoCategory resource identifies a category that has been or could be associated with uploaded
    /// videos.</summary>
    public class VideoCategory : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the video category.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("id")]
        public virtual string Id { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#videoCategory".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The snippet object contains basic details about the video category, including its title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("snippet")]
        public virtual VideoCategorySnippet Snippet { get; set; } 

    }    

    public class VideoCategoryListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of video categories that can be associated with YouTube videos. In this map, the video
        /// category ID is the map key, and its value is the corresponding videoCategory resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<VideoCategory> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#videoCategoryListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Basic details about a video category, such as its localized title.</summary>
    public class VideoCategorySnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("assignable")]
        public virtual System.Nullable<bool> Assignable { get; set; } 

        /// <summary>The YouTube channel that created the video category.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>The video category's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about the content of a YouTube Video.</summary>
    public class VideoContentDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The value of captions indicates whether the video has captions or not.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("caption")]
        public virtual string Caption { get; set; } 

        /// <summary>Specifies the ratings that the video received under various rating schemes.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("contentRating")]
        public virtual ContentRating ContentRating { get; set; } 

        /// <summary>The countryRestriction object contains information about the countries where a video is (or is not)
        /// viewable.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("countryRestriction")]
        public virtual AccessPolicy CountryRestriction { get; set; } 

        /// <summary>The value of definition indicates whether the video is available in high definition or only in
        /// standard definition.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("definition")]
        public virtual string Definition { get; set; } 

        /// <summary>The value of dimension indicates whether the video is available in 3D or in 2D.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("dimension")]
        public virtual string Dimension { get; set; } 

        /// <summary>The length of the video. The tag value is an ISO 8601 duration in the format PT#M#S, in which the
        /// letters PT indicate that the value specifies a period of time, and the letters M and S refer to length in
        /// minutes and seconds, respectively. The # characters preceding the M and S letters are both integers that
        /// specify the number of minutes (or seconds) of the video. For example, a value of PT15M51S indicates that the
        /// video is 15 minutes and 51 seconds long.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("duration")]
        public virtual string Duration { get; set; } 

        /// <summary>The value of is_license_content indicates whether the video is licensed content.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("licensedContent")]
        public virtual System.Nullable<bool> LicensedContent { get; set; } 

        /// <summary>The regionRestriction object contains information about the countries where a video is (or is not)
        /// viewable. The object will contain either the contentDetails.regionRestriction.allowed property or the
        /// contentDetails.regionRestriction.blocked property.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("regionRestriction")]
        public virtual VideoContentDetailsRegionRestriction RegionRestriction { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>DEPRECATED Region restriction of the video.</summary>
    public class VideoContentDetailsRegionRestriction : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of region codes that identify countries where the video is viewable. If this property is
        /// present and a country is not listed in its value, then the video is blocked from appearing in that country.
        /// If this property is present and contains an empty list, the video is blocked in all countries.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("allowed")]
        public virtual System.Collections.Generic.IList<string> Allowed { get; set; } 

        /// <summary>A list of region codes that identify countries where the video is blocked. If this property is
        /// present and a country is not listed in its value, then the video is viewable in that country. If this
        /// property is present and contains an empty list, the video is viewable in all countries.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("blocked")]
        public virtual System.Collections.Generic.IList<string> Blocked { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class VideoConversionPing : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Defines the context of the ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("context")]
        public virtual string Context { get; set; } 

        /// <summary>The url (without the schema) that the app shall send the ping to. It's at caller's descretion to
        /// decide which schema to use (http vs https) Example of a returned url: //googleads.g.doubleclick.net/pagead/
        /// viewthroughconversion/962985656/?data=path%3DtHe_path%3Btype%3D
        /// like%3Butuid%3DGISQtTNGYqaYl4sKxoVvKA%3Bytvid%3DUrIaJUvIQDg=default The caller must append biscotti
        /// authentication (ms param in case of mobile, for example) to this ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("conversionUrl")]
        public virtual string ConversionUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class VideoConversionPings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Pings that the app shall fire for a video (authenticated by biscotti cookie). Each ping has a
        /// context, in which the app must fire the ping, and a url identifying the ping.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("pings")]
        public virtual System.Collections.Generic.IList<VideoConversionPing> Pings { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes original video file properties, including technical details about audio and video streams,
    /// but also metadata information like content length, digitization time, or geotagging information.</summary>
    public class VideoFileDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of audio streams contained in the uploaded video file. Each item in the list contains
        /// detailed metadata about an audio stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("audioStreams")]
        public virtual System.Collections.Generic.IList<VideoFileDetailsAudioStream> AudioStreams { get; set; } 

        /// <summary>The uploaded video file's combined (video and audio) bitrate in bits per second.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bitrateBps")]
        public virtual System.Nullable<ulong> BitrateBps { get; set; } 

        /// <summary>The uploaded video file's container format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("container")]
        public virtual string Container { get; set; } 

        /// <summary>The date and time when the uploaded video file was created. The value is specified in ISO 8601
        /// format. Currently, the following ISO 8601 formats are supported: - Date only: YYYY-MM-DD - Naive time: YYYY-
        /// MM-DDTHH:MM:SS - Time with timezone: YYYY-MM-DDTHH:MM:SS+HH:MM</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("creationTime")]
        public virtual string CreationTime { get; set; } 

        /// <summary>The length of the uploaded video in milliseconds.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("durationMs")]
        public virtual System.Nullable<ulong> DurationMs { get; set; } 

        /// <summary>The uploaded file's name. This field is present whether a video file or another type of file was
        /// uploaded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileName")]
        public virtual string FileName { get; set; } 

        /// <summary>The uploaded file's size in bytes. This field is present whether a video file or another type of
        /// file was uploaded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileSize")]
        public virtual System.Nullable<ulong> FileSize { get; set; } 

        /// <summary>The uploaded file's type as detected by YouTube's video processing engine. Currently, YouTube only
        /// processes video files, but this field is present whether a video file or another type of file was
        /// uploaded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileType")]
        public virtual string FileType { get; set; } 

        /// <summary>Geographic coordinates that identify the place where the uploaded video was recorded. Coordinates
        /// are defined using WGS 84.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recordingLocation")]
        public virtual GeoPoint RecordingLocation { get; set; } 

        /// <summary>A list of video streams contained in the uploaded video file. Each item in the list contains
        /// detailed metadata about a video stream.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("videoStreams")]
        public virtual System.Collections.Generic.IList<VideoFileDetailsVideoStream> VideoStreams { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about an audio stream.</summary>
    public class VideoFileDetailsAudioStream : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The audio stream's bitrate, in bits per second.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bitrateBps")]
        public virtual System.Nullable<ulong> BitrateBps { get; set; } 

        /// <summary>The number of audio channels that the stream contains.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelCount")]
        public virtual System.Nullable<long> ChannelCount { get; set; } 

        /// <summary>The audio codec that the stream uses.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("codec")]
        public virtual string Codec { get; set; } 

        /// <summary>A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor
        /// code.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("vendor")]
        public virtual string Vendor { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Information about a video stream.</summary>
    public class VideoFileDetailsVideoStream : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The video content's display aspect ratio, which specifies the aspect ratio in which the video
        /// should be displayed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("aspectRatio")]
        public virtual System.Nullable<double> AspectRatio { get; set; } 

        /// <summary>The video stream's bitrate, in bits per second.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bitrateBps")]
        public virtual System.Nullable<ulong> BitrateBps { get; set; } 

        /// <summary>The video codec that the stream uses.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("codec")]
        public virtual string Codec { get; set; } 

        /// <summary>The video stream's frame rate, in frames per second.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("frameRateFps")]
        public virtual System.Nullable<double> FrameRateFps { get; set; } 

        /// <summary>The encoded video content's height in pixels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("heightPixels")]
        public virtual System.Nullable<long> HeightPixels { get; set; } 

        /// <summary>The amount that YouTube needs to rotate the original source content to properly display the
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rotation")]
        public virtual string Rotation { get; set; } 

        /// <summary>A value that uniquely identifies a video vendor. Typically, the value is a four-letter vendor
        /// code.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("vendor")]
        public virtual string Vendor { get; set; } 

        /// <summary>The encoded video content's width in pixels. You can calculate the video's encoding aspect ratio as
        /// width_pixels / height_pixels.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("widthPixels")]
        public virtual System.Nullable<long> WidthPixels { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class VideoGetRatingResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of ratings that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<VideoRating> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#videoGetRatingResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    public class VideoListResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Etag of this resource.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("etag")]
        public virtual string ETag { get; set; } 

        /// <summary>Serialized EventId of the request which produced this response.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("eventId")]
        public virtual string EventId { get; set; } 

        /// <summary>A list of videos that match the request criteria.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("items")]
        public virtual System.Collections.Generic.IList<Video> Items { get; set; } 

        /// <summary>Identifies what kind of resource this is. Value: the fixed string
        /// "youtube#videoListResponse".</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("kind")]
        public virtual string Kind { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the next page in the
        /// result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("pageInfo")]
        public virtual PageInfo PageInfo { get; set; } 

        /// <summary>The token that can be used as the value of the pageToken parameter to retrieve the previous page in
        /// the result set.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("prevPageToken")]
        public virtual string PrevPageToken { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("tokenPagination")]
        public virtual TokenPagination TokenPagination { get; set; } 

        /// <summary>The visitorId identifies the visitor.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("visitorId")]
        public virtual string VisitorId { get; set; } 

    }    

    /// <summary>Details about the live streaming metadata.</summary>
    public class VideoLiveStreamingDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The time that the broadcast actually ended. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format. This value will not be available until the broadcast is over.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("actualEndTime")]
        public virtual string ActualEndTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ActualEndTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ActualEndTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ActualEndTimeRaw);
            }
            set
            {
                ActualEndTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The time that the broadcast actually started. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format. This value will not be available until the broadcast begins.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("actualStartTime")]
        public virtual string ActualStartTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ActualStartTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ActualStartTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ActualStartTimeRaw);
            }
            set
            {
                ActualStartTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The number of viewers currently watching the broadcast. The property and its value will be present
        /// if the broadcast has current viewers and the broadcast owner has not hidden the viewcount for the video.
        /// Note that YouTube stops tracking the number of concurrent viewers for a broadcast when the broadcast ends.
        /// So, this property would not identify the number of viewers watching an archived video of a live broadcast
        /// that already ended.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("concurrentViewers")]
        public virtual System.Nullable<ulong> ConcurrentViewers { get; set; } 

        /// <summary>The time that the broadcast is scheduled to end. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format. If the value is empty or the property is not present, then the broadcast is
        /// scheduled to continue indefinitely.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduledEndTime")]
        public virtual string ScheduledEndTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ScheduledEndTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ScheduledEndTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ScheduledEndTimeRaw);
            }
            set
            {
                ScheduledEndTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The time that the broadcast is scheduled to begin. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduledStartTime")]
        public virtual string ScheduledStartTimeRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="ScheduledStartTimeRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> ScheduledStartTime
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(ScheduledStartTimeRaw);
            }
            set
            {
                ScheduledStartTimeRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Localized versions of certain video properties (e.g. title).</summary>
    public class VideoLocalization : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Localized version of the video's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Localized version of the video's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Details about monetization of a YouTube Video.</summary>
    public class VideoMonetizationDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The value of access indicates whether the video can be monetized or not.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("access")]
        public virtual AccessPolicy Access { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Player to be used for a video playback.</summary>
    public class VideoPlayer : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>An  tag that embeds a player that will play the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("embedHtml")]
        public virtual string EmbedHtml { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Describes processing status and progress and availability of some other Video resource parts.</summary>
    public class VideoProcessingDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>This value indicates whether video editing suggestions, which might improve video quality or the
        /// playback experience, are available for the video. You can retrieve these suggestions by requesting the
        /// suggestions part in your videos.list() request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("editorSuggestionsAvailability")]
        public virtual string EditorSuggestionsAvailability { get; set; } 

        /// <summary>This value indicates whether file details are available for the uploaded video. You can retrieve a
        /// video's file details by requesting the fileDetails part in your videos.list() request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("fileDetailsAvailability")]
        public virtual string FileDetailsAvailability { get; set; } 

        /// <summary>The reason that YouTube failed to process the video. This property will only have a value if the
        /// processingStatus property's value is failed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingFailureReason")]
        public virtual string ProcessingFailureReason { get; set; } 

        /// <summary>This value indicates whether the video processing engine has generated suggestions that might
        /// improve YouTube's ability to process the the video, warnings that explain video processing problems, or
        /// errors that cause video processing problems. You can retrieve these suggestions by requesting the
        /// suggestions part in your videos.list() request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingIssuesAvailability")]
        public virtual string ProcessingIssuesAvailability { get; set; } 

        /// <summary>The processingProgress object contains information about the progress YouTube has made in
        /// processing the video. The values are really only relevant if the video's processing status is
        /// processing.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingProgress")]
        public virtual VideoProcessingDetailsProcessingProgress ProcessingProgress { get; set; } 

        /// <summary>The video's processing status. This value indicates whether YouTube was able to process the video
        /// or if the video is still being processed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingStatus")]
        public virtual string ProcessingStatus { get; set; } 

        /// <summary>This value indicates whether keyword (tag) suggestions are available for the video. Tags can be
        /// added to a video's metadata to make it easier for other users to find the video. You can retrieve these
        /// suggestions by requesting the suggestions part in your videos.list() request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tagSuggestionsAvailability")]
        public virtual string TagSuggestionsAvailability { get; set; } 

        /// <summary>This value indicates whether thumbnail images have been generated for the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnailsAvailability")]
        public virtual string ThumbnailsAvailability { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Video processing progress and completion time estimate.</summary>
    public class VideoProcessingDetailsProcessingProgress : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The number of parts of the video that YouTube has already processed. You can estimate the
        /// percentage of the video that YouTube has already processed by calculating: 100 * parts_processed /
        /// parts_total
        ///
        /// Note that since the estimated number of parts could increase without a corresponding increase in the number
        /// of parts that have already been processed, it is possible that the calculated progress could periodically
        /// decrease while YouTube processes a video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("partsProcessed")]
        public virtual System.Nullable<ulong> PartsProcessed { get; set; } 

        /// <summary>An estimate of the total number of parts that need to be processed for the video. The number may be
        /// updated with more precise estimates while YouTube processes the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("partsTotal")]
        public virtual System.Nullable<ulong> PartsTotal { get; set; } 

        /// <summary>An estimate of the amount of time, in millseconds, that YouTube needs to finish processing the
        /// video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("timeLeftMs")]
        public virtual System.Nullable<ulong> TimeLeftMs { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Project specific details about the content of a YouTube Video.</summary>
    public class VideoProjectDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of project tags associated with the video during the upload.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tags")]
        public virtual System.Collections.Generic.IList<string> Tags { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    public class VideoRating : Google.Apis.Requests.IDirectResponseSchema
    {
        [Newtonsoft.Json.JsonPropertyAttribute("rating")]
        public virtual string Rating { get; set; } 

        [Newtonsoft.Json.JsonPropertyAttribute("videoId")]
        public virtual string VideoId { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Recording information associated with the video.</summary>
    public class VideoRecordingDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The geolocation information associated with the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("location")]
        public virtual GeoPoint Location { get; set; } 

        /// <summary>The text description of the location where the video was recorded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("locationDescription")]
        public virtual string LocationDescription { get; set; } 

        /// <summary>The date and time when the video was recorded. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sssZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("recordingDate")]
        public virtual string RecordingDateRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="RecordingDateRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> RecordingDate
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(RecordingDateRaw);
            }
            set
            {
                RecordingDateRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a video, including title, description, uploader, thumbnails and category.</summary>
    public class VideoSnippet : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The YouTube video category associated with the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("categoryId")]
        public virtual string CategoryId { get; set; } 

        /// <summary>The ID that YouTube uses to uniquely identify the channel that the video was uploaded to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelId")]
        public virtual string ChannelId { get; set; } 

        /// <summary>Channel title for the channel that the video belongs to.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("channelTitle")]
        public virtual string ChannelTitle { get; set; } 

        /// <summary>The language of the videos's default snippet.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("defaultLanguage")]
        public virtual string DefaultLanguage { get; set; } 

        /// <summary>The video's description.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>Indicates if the video is an upcoming/active live broadcast. Or it's "none" if the video is not an
        /// upcoming/active live broadcast.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("liveBroadcastContent")]
        public virtual string LiveBroadcastContent { get; set; } 

        /// <summary>Localized snippet selected with the hl parameter. If no such localization exists, this field is
        /// populated with the default snippet. (Read-only)</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("localized")]
        public virtual VideoLocalization Localized { get; set; } 

        /// <summary>The date and time that the video was uploaded. The value is specified in ISO 8601 (YYYY-MM-
        /// DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishedAt")]
        public virtual string PublishedAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishedAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishedAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishedAtRaw);
            }
            set
            {
                PublishedAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>A list of keyword tags associated with the video. Tags may contain spaces. This field is only
        /// visible to the video's uploader.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tags")]
        public virtual System.Collections.Generic.IList<string> Tags { get; set; } 

        /// <summary>A map of thumbnail images associated with the video. For each object in the map, the key is the
        /// name of the thumbnail image, and the value is an object that contains other information about the
        /// thumbnail.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("thumbnails")]
        public virtual ThumbnailDetails Thumbnails { get; set; } 

        /// <summary>The video's title.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("title")]
        public virtual string Title { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Statistics about the video, such as the number of times the video was viewed or liked.</summary>
    public class VideoStatistics : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The number of comments for the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("commentCount")]
        public virtual System.Nullable<ulong> CommentCount { get; set; } 

        /// <summary>The number of users who have indicated that they disliked the video by giving it a negative
        /// rating.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("dislikeCount")]
        public virtual System.Nullable<ulong> DislikeCount { get; set; } 

        /// <summary>The number of users who currently have the video marked as a favorite video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("favoriteCount")]
        public virtual System.Nullable<ulong> FavoriteCount { get; set; } 

        /// <summary>The number of users who have indicated that they liked the video by giving it a positive
        /// rating.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("likeCount")]
        public virtual System.Nullable<ulong> LikeCount { get; set; } 

        /// <summary>The number of times the video has been viewed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("viewCount")]
        public virtual System.Nullable<ulong> ViewCount { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Basic details about a video category, such as its localized title.</summary>
    public class VideoStatus : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>This value indicates if the video can be embedded on another website.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("embeddable")]
        public virtual System.Nullable<bool> Embeddable { get; set; } 

        /// <summary>This value explains why a video failed to upload. This property is only present if the uploadStatus
        /// property indicates that the upload failed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("failureReason")]
        public virtual string FailureReason { get; set; } 

        /// <summary>The video's license.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("license")]
        public virtual string License { get; set; } 

        /// <summary>The video's privacy status.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("privacyStatus")]
        public virtual string PrivacyStatus { get; set; } 

        /// <summary>This value indicates if the extended video statistics on the watch page can be viewed by everyone.
        /// Note that the view count, likes, etc will still be visible if this is disabled.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publicStatsViewable")]
        public virtual System.Nullable<bool> PublicStatsViewable { get; set; } 

        /// <summary>The date and time when the video is scheduled to publish. It can be set only if the privacy status
        /// of the video is private. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("publishAt")]
        public virtual string PublishAtRaw { get; set; }

        /// <summary><seealso cref="System.DateTime"/> representation of <see cref="PublishAtRaw"/>.</summary>
        [Newtonsoft.Json.JsonIgnore]
        public virtual System.Nullable<System.DateTime> PublishAt
        {
            get
            {
                return Google.Apis.Util.Utilities.GetDateTimeFromString(PublishAtRaw);
            }
            set
            {
                PublishAtRaw = Google.Apis.Util.Utilities.GetStringFromDateTime(value);
            }
        }

        /// <summary>This value explains why YouTube rejected an uploaded video. This property is only present if the
        /// uploadStatus property indicates that the upload was rejected.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("rejectionReason")]
        public virtual string RejectionReason { get; set; } 

        /// <summary>The status of the uploaded video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("uploadStatus")]
        public virtual string UploadStatus { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Specifies suggestions on how to improve video content, including encoding hints, tag suggestions, and
    /// editor suggestions.</summary>
    public class VideoSuggestions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of video editing operations that might improve the video quality or playback experience of
        /// the uploaded video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("editorSuggestions")]
        public virtual System.Collections.Generic.IList<string> EditorSuggestions { get; set; } 

        /// <summary>A list of errors that will prevent YouTube from successfully processing the uploaded video video.
        /// These errors indicate that, regardless of the video's current processing status, eventually, that status
        /// will almost certainly be failed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingErrors")]
        public virtual System.Collections.Generic.IList<string> ProcessingErrors { get; set; } 

        /// <summary>A list of suggestions that may improve YouTube's ability to process the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingHints")]
        public virtual System.Collections.Generic.IList<string> ProcessingHints { get; set; } 

        /// <summary>A list of reasons why YouTube may have difficulty transcoding the uploaded video or that might
        /// result in an erroneous transcoding. These warnings are generated before YouTube actually processes the
        /// uploaded video file. In addition, they identify issues that are unlikely to cause the video processing to
        /// fail but that might cause problems such as sync issues, video artifacts, or a missing audio track.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("processingWarnings")]
        public virtual System.Collections.Generic.IList<string> ProcessingWarnings { get; set; } 

        /// <summary>A list of keyword tags that could be added to the video's metadata to increase the likelihood that
        /// users will locate your video when searching or browsing on YouTube.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tagSuggestions")]
        public virtual System.Collections.Generic.IList<VideoSuggestionsTagSuggestion> TagSuggestions { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A single tag suggestion with it's relevance information.</summary>
    public class VideoSuggestionsTagSuggestion : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A set of video categories for which the tag is relevant. You can use this information to display
        /// appropriate tag suggestions based on the video category that the video uploader associates with the video.
        /// By default, tag suggestions are relevant for all categories if there are no restricts defined for the
        /// keyword.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("categoryRestricts")]
        public virtual System.Collections.Generic.IList<string> CategoryRestricts { get; set; } 

        /// <summary>The keyword tag suggested for the video.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("tag")]
        public virtual string Tag { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Freebase topic information related to the video.</summary>
    public class VideoTopicDetails : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Similar to topic_id, except that these topics are merely relevant to the video. These are topics
        /// that may be mentioned in, or appear in the video. You can retrieve information about each topic using
        /// Freebase Topic API.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("relevantTopicIds")]
        public virtual System.Collections.Generic.IList<string> RelevantTopicIds { get; set; } 

        /// <summary>A list of Freebase topic IDs that are centrally associated with the video. These are topics that
        /// are centrally featured in the video, and it can be said that the video is mainly about each of these. You
        /// can retrieve information about each topic using the Freebase Topic API.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("topicIds")]
        public virtual System.Collections.Generic.IList<string> TopicIds { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Branding properties for the watch.</summary>
    public class WatchSettings : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The text color for the video watch page's branded area.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("backgroundColor")]
        public virtual string BackgroundColor { get; set; } 

        /// <summary>An ID that uniquely identifies a playlist that displays next to the video player.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("featuredPlaylistId")]
        public virtual string FeaturedPlaylistId { get; set; } 

        /// <summary>The background color for the video watch page's branded area.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("textColor")]
        public virtual string TextColor { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }
}

namespace Google.Apis.YouTube.v3
{
    /// <summary>The YouTube Service.</summary>
    public class YouTubeService : Google.Apis.Services.BaseClientService
    {
        /// <summary>The API version.</summary>
        public const string Version = "v3";

        /// <summary>The discovery version used to generate this service.</summary>
        public static Google.Apis.Discovery.DiscoveryVersion DiscoveryVersionUsed =
            Google.Apis.Discovery.DiscoveryVersion.Version_1_0;

        /// <summary>Constructs a new service.</summary>
        public YouTubeService() :
            this(new Google.Apis.Services.BaseClientService.Initializer()) {}

        /// <summary>Constructs a new service.</summary>
        /// <param name="initializer">The service initializer.</param>
        public YouTubeService(Google.Apis.Services.BaseClientService.Initializer initializer)
            : base(initializer)
        {
            activities = new ActivitiesResource(this);
            captions = new CaptionsResource(this);
            channelBanners = new ChannelBannersResource(this);
            channelSections = new ChannelSectionsResource(this);
            channels = new ChannelsResource(this);
            commentThreads = new CommentThreadsResource(this);
            comments = new CommentsResource(this);
            guideCategories = new GuideCategoriesResource(this);
            i18nLanguages = new I18nLanguagesResource(this);
            i18nRegions = new I18nRegionsResource(this);
            liveBroadcasts = new LiveBroadcastsResource(this);
            liveStreams = new LiveStreamsResource(this);
            playlistItems = new PlaylistItemsResource(this);
            playlists = new PlaylistsResource(this);
            search = new SearchResource(this);
            subscriptions = new SubscriptionsResource(this);
            thumbnails = new ThumbnailsResource(this);
            videoCategories = new VideoCategoriesResource(this);
            videos = new VideosResource(this);
            watermarks = new WatermarksResource(this);
        }

        /// <summary>Gets the service supported features.</summary>
        public override System.Collections.Generic.IList<string> Features
        {
            get { return new string[0]; }
        }

        /// <summary>Gets the service name.</summary>
        public override string Name
        {
            get { return "youtube"; }
        }

        /// <summary>Gets the service base URI.</summary>
        public override string BaseUri
        {
            get { return "https://www.googleapis.com/youtube/v3/"; }
        }

        /// <summary>Gets the service base path.</summary>
        public override string BasePath
        {
            get { return "youtube/v3/"; }
        }

        /// <summary>Available OAuth 2.0 scopes for use with the YouTube Data API.</summary>
        public class Scope
        {
            /// <summary>Manage your YouTube account</summary>
            public static string Youtube = "https://www.googleapis.com/auth/youtube";

            /// <summary>Manage your YouTube account</summary>
            public static string YoutubeForceSsl = "https://www.googleapis.com/auth/youtube.force-ssl";

            /// <summary>View your YouTube account</summary>
            public static string YoutubeReadonly = "https://www.googleapis.com/auth/youtube.readonly";

            /// <summary>Manage your YouTube videos</summary>
            public static string YoutubeUpload = "https://www.googleapis.com/auth/youtube.upload";

            /// <summary>View and manage your assets and associated content on YouTube</summary>
            public static string Youtubepartner = "https://www.googleapis.com/auth/youtubepartner";

            /// <summary>View private information of your YouTube channel relevant during the audit process with a
            /// YouTube partner</summary>
            public static string YoutubepartnerChannelAudit = "https://www.googleapis.com/auth/youtubepartner-channel-audit";

        }



        private readonly ActivitiesResource activities;

        /// <summary>Gets the Activities resource.</summary>
        public virtual ActivitiesResource Activities
        {
            get { return activities; }
        }

        private readonly CaptionsResource captions;

        /// <summary>Gets the Captions resource.</summary>
        public virtual CaptionsResource Captions
        {
            get { return captions; }
        }

        private readonly ChannelBannersResource channelBanners;

        /// <summary>Gets the ChannelBanners resource.</summary>
        public virtual ChannelBannersResource ChannelBanners
        {
            get { return channelBanners; }
        }

        private readonly ChannelSectionsResource channelSections;

        /// <summary>Gets the ChannelSections resource.</summary>
        public virtual ChannelSectionsResource ChannelSections
        {
            get { return channelSections; }
        }

        private readonly ChannelsResource channels;

        /// <summary>Gets the Channels resource.</summary>
        public virtual ChannelsResource Channels
        {
            get { return channels; }
        }

        private readonly CommentThreadsResource commentThreads;

        /// <summary>Gets the CommentThreads resource.</summary>
        public virtual CommentThreadsResource CommentThreads
        {
            get { return commentThreads; }
        }

        private readonly CommentsResource comments;

        /// <summary>Gets the Comments resource.</summary>
        public virtual CommentsResource Comments
        {
            get { return comments; }
        }

        private readonly GuideCategoriesResource guideCategories;

        /// <summary>Gets the GuideCategories resource.</summary>
        public virtual GuideCategoriesResource GuideCategories
        {
            get { return guideCategories; }
        }

        private readonly I18nLanguagesResource i18nLanguages;

        /// <summary>Gets the I18nLanguages resource.</summary>
        public virtual I18nLanguagesResource I18nLanguages
        {
            get { return i18nLanguages; }
        }

        private readonly I18nRegionsResource i18nRegions;

        /// <summary>Gets the I18nRegions resource.</summary>
        public virtual I18nRegionsResource I18nRegions
        {
            get { return i18nRegions; }
        }

        private readonly LiveBroadcastsResource liveBroadcasts;

        /// <summary>Gets the LiveBroadcasts resource.</summary>
        public virtual LiveBroadcastsResource LiveBroadcasts
        {
            get { return liveBroadcasts; }
        }

        private readonly LiveStreamsResource liveStreams;

        /// <summary>Gets the LiveStreams resource.</summary>
        public virtual LiveStreamsResource LiveStreams
        {
            get { return liveStreams; }
        }

        private readonly PlaylistItemsResource playlistItems;

        /// <summary>Gets the PlaylistItems resource.</summary>
        public virtual PlaylistItemsResource PlaylistItems
        {
            get { return playlistItems; }
        }

        private readonly PlaylistsResource playlists;

        /// <summary>Gets the Playlists resource.</summary>
        public virtual PlaylistsResource Playlists
        {
            get { return playlists; }
        }

        private readonly SearchResource search;

        /// <summary>Gets the Search resource.</summary>
        public virtual SearchResource Search
        {
            get { return search; }
        }

        private readonly SubscriptionsResource subscriptions;

        /// <summary>Gets the Subscriptions resource.</summary>
        public virtual SubscriptionsResource Subscriptions
        {
            get { return subscriptions; }
        }

        private readonly ThumbnailsResource thumbnails;

        /// <summary>Gets the Thumbnails resource.</summary>
        public virtual ThumbnailsResource Thumbnails
        {
            get { return thumbnails; }
        }

        private readonly VideoCategoriesResource videoCategories;

        /// <summary>Gets the VideoCategories resource.</summary>
        public virtual VideoCategoriesResource VideoCategories
        {
            get { return videoCategories; }
        }

        private readonly VideosResource videos;

        /// <summary>Gets the Videos resource.</summary>
        public virtual VideosResource Videos
        {
            get { return videos; }
        }

        private readonly WatermarksResource watermarks;

        /// <summary>Gets the Watermarks resource.</summary>
        public virtual WatermarksResource Watermarks
        {
            get { return watermarks; }
        }
    }

    ///<summary>A base abstract class for YouTube requests.</summary>
    public abstract class YouTubeBaseServiceRequest<TResponse> : Google.Apis.Requests.ClientServiceRequest<TResponse>
    {
        ///<summary>Constructs a new YouTubeBaseServiceRequest instance.</summary>
        protected YouTubeBaseServiceRequest(Google.Apis.Services.IClientService service)
            : base(service)
        {
        }

        /// <summary>Data format for the response.</summary>
        /// [default: json]
        [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<AltEnum> Alt { get; set; }

        /// <summary>Data format for the response.</summary>
        public enum AltEnum
        {
            /// <summary>Responses with Content-Type of application/json</summary>
            [Google.Apis.Util.StringValueAttribute("json")]
            Json,
        }

        /// <summary>Selector specifying which fields to include in a partial response.</summary>
        [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Fields { get; set; }

        /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and reports.
        /// Required unless you provide an OAuth 2.0 token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Key { get; set; }

        /// <summary>OAuth 2.0 token for the current user.</summary>
        [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string OauthToken { get; set; }

        /// <summary>Returns response with indentations and line breaks.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> PrettyPrint { get; set; }

        /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
        /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.</summary>
        [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string QuotaUser { get; set; }

        /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
        /// limits.</summary>
        [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UserIp { get; set; }

        /// <summary>Initializes YouTube parameter list.</summary>
        protected override void InitParameters()
        {
            base.InitParameters();

            RequestParameters.Add(
                "alt", new Google.Apis.Discovery.Parameter
                {
                    Name = "alt",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "json",
                    Pattern = null,
                });
            RequestParameters.Add(
                "fields", new Google.Apis.Discovery.Parameter
                {
                    Name = "fields",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "key", new Google.Apis.Discovery.Parameter
                {
                    Name = "key",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "oauth_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "oauth_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "prettyPrint", new Google.Apis.Discovery.Parameter
                {
                    Name = "prettyPrint",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "quotaUser", new Google.Apis.Discovery.Parameter
                {
                    Name = "quotaUser",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "userIp", new Google.Apis.Discovery.Parameter
                {
                    Name = "userIp",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
        }
    }

    /// <summary>The "activities" collection of methods.</summary>
    public class ActivitiesResource
    {
        private const string Resource = "activities";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ActivitiesResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Posts a bulletin for a specific channel. (The user submitting the request must be authorized to act
        /// on the channel's behalf.)
        ///
        /// Note: Even though an activity resource can contain information about actions like a user rating a video or
        /// marking a video as a favorite, you need to use other API methods to generate those activity resources. For
        /// example, you would use the API's videos.rate() method to rate a video and the playlistItems.insert() method
        /// to mark a video as a favorite.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and contentDetails.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Activity body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Posts a bulletin for a specific channel. (The user submitting the request must be authorized to act
        /// on the channel's behalf.)
        ///
        /// Note: Even though an activity resource can contain information about actions like a user rating a video or
        /// marking a video as a favorite, you need to use other API methods to generate those activity resources. For
        /// example, you would use the API's videos.rate() method to rate a video and the playlistItems.insert() method
        /// to mark a video as a favorite.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Activity>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Activity body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and contentDetails.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Activity Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "activities"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a list of channel activity events that match the request criteria. For example, you can
        /// retrieve events associated with a particular channel, events associated with the user's subscriptions and
        /// Google+ friends, or the YouTube home page feed, which is customized for each user.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more activity resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id, snippet, and
        /// contentDetails.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a activity resource, the snippet property contains other properties that identify the type
        /// of activity, a display title for the activity, and so forth. If you set part=snippet, the API response will also
        /// contain all of those nested properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of channel activity events that match the request criteria. For example, you can
        /// retrieve events associated with a particular channel, events associated with the user's subscriptions and
        /// Google+ friends, or the YouTube home page feed, which is customized for each user.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ActivityListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more activity resource properties
            /// that the API response will include. The part names that you can include in the parameter value are id,
            /// snippet, and contentDetails.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a activity resource, the snippet property contains other
            /// properties that identify the type of activity, a display title for the activity, and so forth. If you
            /// set part=snippet, the API response will also contain all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The regionCode parameter instructs the API to return results for the specified country. The
            /// parameter value is an ISO 3166-1 alpha-2 country code. YouTube uses this value when the authorized
            /// user's previous activity on YouTube does not provide enough information to generate the activity
            /// feed.</summary>
            [Google.Apis.Util.RequestParameterAttribute("regionCode", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RegionCode { get; set; }

            /// <summary>The publishedBefore parameter specifies the date and time before which an activity must have
            /// occurred for that activity to be included in the API response. If the parameter value specifies a day,
            /// but not a time, then any activities that occurred that day will be excluded from the result set. The
            /// value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
            [Google.Apis.Util.RequestParameterAttribute("publishedBefore", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<System.DateTime> PublishedBefore { get; set; }

            /// <summary>The channelId parameter specifies a unique YouTube channel ID. The API will then return a list
            /// of that channel's activities.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>Set this parameter's value to true to retrieve a feed of the authenticated user's
            /// activities.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>Set this parameter's value to true to retrieve the activity feed that displays on the YouTube
            /// home page for the currently authenticated user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("home", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Home { get; set; }

            /// <summary>The publishedAfter parameter specifies the earliest date and time that an activity could have
            /// occurred for that activity to be included in the API response. If the parameter value specifies a day,
            /// but not a time, then any activities that occurred that day will be included in the result set. The value
            /// is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.</summary>
            [Google.Apis.Util.RequestParameterAttribute("publishedAfter", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<System.DateTime> PublishedAfter { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "activities"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "regionCode", new Google.Apis.Discovery.Parameter
                    {
                        Name = "regionCode",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "publishedBefore", new Google.Apis.Discovery.Parameter
                    {
                        Name = "publishedBefore",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "home", new Google.Apis.Discovery.Parameter
                    {
                        Name = "home",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "publishedAfter", new Google.Apis.Discovery.Parameter
                    {
                        Name = "publishedAfter",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "captions" collection of methods.</summary>
    public class CaptionsResource
    {
        private const string Resource = "captions";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public CaptionsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a specified caption track.</summary>
        /// <param name="id">The id parameter identifies the caption track that is being deleted. The value is a caption track
        /// ID as identified by the id property in a caption resource.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a specified caption track.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter identifies the caption track that is being deleted. The value is a caption
            /// track ID as identified by the id property in a caption resource.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "captions"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOf", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOf",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "debugProjectIdOverride", new Google.Apis.Discovery.Parameter
                    {
                        Name = "debugProjectIdOverride",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Downloads a caption track. The caption track is returned in its original format unless the request
        /// specifies a value for the tfmt parameter and in its original language unless the request specifies a value
        /// for the tlang parameter.</summary>
        /// <param name="id">The id parameter identifies the caption track that is being retrieved. The value is a caption track
        /// ID as identified by the id property in a caption resource.</param>
        public virtual DownloadRequest Download(string id)
        {
            return new DownloadRequest(service, id);
        }

        /// <summary>Downloads a caption track. The caption track is returned in its original format unless the request
        /// specifies a value for the tfmt parameter and in its original language unless the request specifies a value
        /// for the tlang parameter.</summary>
        public class DownloadRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Download request.</summary>
            public DownloadRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                MediaDownloader = new Google.Apis.Download.MediaDownloader(service);
                InitParameters();
            }


            /// <summary>The id parameter identifies the caption track that is being retrieved. The value is a caption
            /// track ID as identified by the id property in a caption resource.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Id { get; private set; }

            /// <summary>The tfmt parameter specifies that the caption track should be returned in a specific format. If
            /// the parameter is not included in the request, the track is returned in its original format.</summary>
            [Google.Apis.Util.RequestParameterAttribute("tfmt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<TfmtEnum> Tfmt { get; set; }

            /// <summary>The tfmt parameter specifies that the caption track should be returned in a specific format. If
            /// the parameter is not included in the request, the track is returned in its original format.</summary>
            public enum TfmtEnum
            {
                /// <summary>SubViewer subtitle.</summary>
                [Google.Apis.Util.StringValueAttribute("sbv")]
                Sbv,
                /// <summary>Scenarist Closed Caption format.</summary>
                [Google.Apis.Util.StringValueAttribute("scc")]
                Scc,
                /// <summary>SubRip subtitle.</summary>
                [Google.Apis.Util.StringValueAttribute("srt")]
                Srt,
                /// <summary>Timed Text Markup Language caption.</summary>
                [Google.Apis.Util.StringValueAttribute("ttml")]
                Ttml,
                /// <summary>Web Video Text Tracks caption.</summary>
                [Google.Apis.Util.StringValueAttribute("vtt")]
                Vtt,
            }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The tlang parameter specifies that the API response should return a translation of the
            /// specified caption track. The parameter value is an ISO 639-1 two-letter language code that identifies
            /// the desired caption language. The translation is generated by using machine translation, such as Google
            /// Translate.</summary>
            [Google.Apis.Util.RequestParameterAttribute("tlang", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Tlang { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "download"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "captions/{id}"; }
            }

            /// <summary>Initializes Download parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "tfmt", new Google.Apis.Discovery.Parameter
                    {
                        Name = "tfmt",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOf", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOf",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "tlang", new Google.Apis.Discovery.Parameter
                    {
                        Name = "tlang",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "debugProjectIdOverride", new Google.Apis.Discovery.Parameter
                    {
                        Name = "debugProjectIdOverride",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

            /// <summary>Gets the media downloader.</summary>
            public Google.Apis.Download.IMediaDownloader MediaDownloader { get; private set; }

            /// <summary>Synchronously download the media into the given stream.</summary>
            public virtual void Download(System.IO.Stream stream)
            {
                MediaDownloader.Download(this.GenerateRequestUri(), stream);
            }

            /// <summary>Asynchronously download the media into the given stream.</summary>
            public virtual System.Threading.Tasks.Task<Google.Apis.Download.IDownloadProgress> DownloadAsync(System.IO.Stream stream)
            {
                return MediaDownloader.DownloadAsync(this.GenerateRequestUri(), stream);
            }

            /// <summary>Asynchronously download the media into the given stream.</summary>
            public virtual System.Threading.Tasks.Task<Google.Apis.Download.IDownloadProgress> DownloadAsync(System.IO.Stream stream,
                System.Threading.CancellationToken cancellationToken)
            {
                return MediaDownloader.DownloadAsync(this.GenerateRequestUri(), stream, cancellationToken);
            }

        }

        /// <summary>Uploads a caption track.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter specifies the caption resource parts that the API response will include. Set
        /// the parameter value to snippet.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Caption body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Uploads a caption track.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Caption>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Caption body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter specifies the caption resource parts that the API response will include. Set
            /// the parameter value to snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }

            /// <summary>The sync parameter indicates whether YouTube should automatically synchronize the caption file
            /// with the audio track of the video. If you set the value to true, YouTube will disregard any time codes
            /// that are in the uploaded caption file and generate new time codes for the captions.
            ///
            /// You should set the sync parameter to true if you are uploading a transcript, which has no time codes, or
            /// if you suspect the time codes in your file are incorrect and want YouTube to try to fix them.</summary>
            [Google.Apis.Util.RequestParameterAttribute("sync", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Sync { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Caption Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "captions"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOf", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOf",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "debugProjectIdOverride", new Google.Apis.Discovery.Parameter
                    {
                        Name = "debugProjectIdOverride",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "sync", new Google.Apis.Discovery.Parameter
                    {
                        Name = "sync",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a caption track.</summary>/// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter specifies the caption resource parts that the API response will include. Set
        /// the parameter value to snippet.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual InsertMediaUpload Insert(Google.Apis.YouTube.v3.Data.Caption body, string part, System.IO.Stream stream, string contentType)
        {
            return new InsertMediaUpload(service, body, part, stream, contentType);
        }

        /// <summary>Insert media upload which supports resumable upload.</summary>
        public class InsertMediaUpload : Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Caption, Google.Apis.YouTube.v3.Data.Caption>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>The part parameter specifies the caption resource parts that the API response will include. Set
            /// the parameter value to snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }

            /// <summary>The sync parameter indicates whether YouTube should automatically synchronize the caption file
            /// with the audio track of the video. If you set the value to true, YouTube will disregard any time codes
            /// that are in the uploaded caption file and generate new time codes for the captions.
            ///
            /// You should set the sync parameter to true if you are uploading a transcript, which has no time codes, or
            /// if you suspect the time codes in your file are incorrect and want YouTube to try to fix them.</summary>
            [Google.Apis.Util.RequestParameterAttribute("sync", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Sync { get; set; }

            /// <summary>Constructs a new Insert media upload instance.</summary>
            public InsertMediaUpload(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Caption body, string
             part, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "captions"), "POST", stream, contentType)
            {
                Part = part;
                Body = body;
            }
        }

        /// <summary>Returns a list of caption tracks that are associated with a specified video. Note that the API
        /// response does not contain the actual captions and that the captions.download method provides the ability to
        /// retrieve a caption track.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more caption resource parts that
        /// the API response will include. The part names that you can include in the parameter value are id and
        /// snippet.</param>
        /// <param name="videoId">The videoId parameter specifies the YouTube video ID of the video for
        /// which the API should return caption tracks.</param>
        public virtual ListRequest List(string part, string videoId)
        {
            return new ListRequest(service, part, videoId);
        }

        /// <summary>Returns a list of caption tracks that are associated with a specified video. Note that the API
        /// response does not contain the actual captions and that the captions.download method provides the ability to
        /// retrieve a caption track.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.CaptionListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part, string videoId)
                : base(service)
            {
                Part = part;
                VideoId = videoId;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more caption resource parts that
            /// the API response will include. The part names that you can include in the parameter value are id and
            /// snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The videoId parameter specifies the YouTube video ID of the video for which the API should
            /// return caption tracks.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoId { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is on behalf of.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of IDs that identify the caption resources
            /// that should be retrieved. Each ID must identify a caption track associated with the specified
            /// video.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "captions"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoId",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOf", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOf",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "debugProjectIdOverride", new Google.Apis.Discovery.Parameter
                    {
                        Name = "debugProjectIdOverride",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a caption track. When updating a caption track, you can change the track's draft status,
        /// upload a new caption file for the track, or both.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include. Set the property value to
        /// snippet if you are updating the track's draft status. Otherwise, set the property value to id.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.Caption body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Updates a caption track. When updating a caption track, you can change the track's draft status,
        /// upload a new caption file for the track, or both.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Caption>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Caption body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include. Set the property
            /// value to snippet if you are updating the track's draft status. Otherwise, set the property value to
            /// id.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }

            /// <summary>Note: The API server only processes the parameter value if the request contains an updated
            /// caption file.
            ///
            /// The sync parameter indicates whether YouTube should automatically synchronize the caption file with the
            /// audio track of the video. If you set the value to true, YouTube will automatically synchronize the
            /// caption track with the audio track.</summary>
            [Google.Apis.Util.RequestParameterAttribute("sync", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Sync { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Caption Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "captions"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOf", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOf",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "debugProjectIdOverride", new Google.Apis.Discovery.Parameter
                    {
                        Name = "debugProjectIdOverride",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "sync", new Google.Apis.Discovery.Parameter
                    {
                        Name = "sync",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a caption track. When updating a caption track, you can change the track's draft status,
        /// upload a new caption file for the track, or both.</summary>/// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include. Set the property value to
        /// snippet if you are updating the track's draft status. Otherwise, set the property value to id.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual UpdateMediaUpload Update(Google.Apis.YouTube.v3.Data.Caption body, string part, System.IO.Stream stream, string contentType)
        {
            return new UpdateMediaUpload(service, body, part, stream, contentType);
        }

        /// <summary>Update media upload which supports resumable upload.</summary>
        public class UpdateMediaUpload : Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Caption, Google.Apis.YouTube.v3.Data.Caption>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include. Set the property
            /// value to snippet if you are updating the track's draft status. Otherwise, set the property value to
            /// id.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>ID of the Google+ Page for the channel that the request is be on behalf of</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOf", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOf { get; set; }

            /// <summary>The debugProjectIdOverride parameter should be used for mimicking a request for a certain
            /// project ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("debugProjectIdOverride", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> DebugProjectIdOverride { get; set; }

            /// <summary>Note: The API server only processes the parameter value if the request contains an updated
            /// caption file.
            ///
            /// The sync parameter indicates whether YouTube should automatically synchronize the caption file with the
            /// audio track of the video. If you set the value to true, YouTube will automatically synchronize the
            /// caption track with the audio track.</summary>
            [Google.Apis.Util.RequestParameterAttribute("sync", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Sync { get; set; }

            /// <summary>Constructs a new Update media upload instance.</summary>
            public UpdateMediaUpload(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Caption body, string
             part, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "captions"), "PUT", stream, contentType)
            {
                Part = part;
                Body = body;
            }
        }
    }

    /// <summary>The "channelBanners" collection of methods.</summary>
    public class ChannelBannersResource
    {
        private const string Resource = "channelBanners";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ChannelBannersResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Uploads a channel banner image to YouTube. This method represents the first two steps in a three-
        /// step process to update the banner image for a channel:
        ///
        /// - Call the channelBanners.insert method to upload the binary image data to YouTube. The image must have a
        /// 16:9 aspect ratio and be at least 2120x1192 pixels. - Extract the url property's value from the response
        /// that the API returns for step 1. - Call the channels.update method to update the channel's branding
        /// settings. Set the brandingSettings.image.bannerExternalUrl property's value to the URL obtained in step
        /// 2.</summary>
        /// <param name="body">The body of the request.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.ChannelBannerResource body)
        {
            return new InsertRequest(service, body);
        }

        /// <summary>Uploads a channel banner image to YouTube. This method represents the first two steps in a three-
        /// step process to update the banner image for a channel:
        ///
        /// - Call the channelBanners.insert method to upload the binary image data to YouTube. The image must have a
        /// 16:9 aspect ratio and be at least 2120x1192 pixels. - Extract the url property's value from the response
        /// that the API returns for step 1. - Call the channels.update method to update the channel's branding
        /// settings. Set the brandingSettings.image.bannerExternalUrl property's value to the URL obtained in step
        /// 2.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ChannelBannerResource>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.ChannelBannerResource body)
                : base(service)
            {
                Body = body;
                InitParameters();
            }


            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.ChannelBannerResource Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channelBanners/insert"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a channel banner image to YouTube. This method represents the first two steps in a three-
        /// step process to update the banner image for a channel:
        ///
        /// - Call the channelBanners.insert method to upload the binary image data to YouTube. The image must have a
        /// 16:9 aspect ratio and be at least 2120x1192 pixels. - Extract the url property's value from the response
        /// that the API returns for step 1. - Call the channels.update method to update the channel's branding
        /// settings. Set the brandingSettings.image.bannerExternalUrl property's value to the URL obtained in step
        /// 2.</summary>/// <param name="body">The body of the request.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual InsertMediaUpload Insert(Google.Apis.YouTube.v3.Data.ChannelBannerResource body, System.IO.Stream stream, string contentType)
        {
            return new InsertMediaUpload(service, body, stream, contentType);
        }

        /// <summary>Insert media upload which supports resumable upload.</summary>
        public class InsertMediaUpload : Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.ChannelBannerResource, Google.Apis.YouTube.v3.Data.ChannelBannerResource>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>Constructs a new Insert media upload instance.</summary>
            public InsertMediaUpload(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.ChannelBannerResource body, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "channelBanners/insert"), "POST", stream, contentType)
            {
                Body = body;
            }
        }
    }

    /// <summary>The "channelSections" collection of methods.</summary>
    public class ChannelSectionsResource
    {
        private const string Resource = "channelSections";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ChannelSectionsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a channelSection.</summary>
        /// <param name="id">The id parameter specifies the YouTube channelSection ID for the resource that is being deleted. In
        /// a channelSection resource, the id property specifies the YouTube channelSection ID.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a channelSection.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube channelSection ID for the resource that is being
            /// deleted. In a channelSection resource, the id property specifies the YouTube channelSection
            /// ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channelSections"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Adds a channelSection for the authenticated user's channel.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and contentDetails.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.ChannelSection body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Adds a channelSection for the authenticated user's channel.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ChannelSection>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.ChannelSection body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and contentDetails.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.ChannelSection Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channelSections"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns channelSection resources that match the API request criteria.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more channelSection resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id,
        /// snippet, and contentDetails.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a channelSection resource, the snippet property contains other properties, such as a
        /// display title for the channelSection. If you set part=snippet, the API response will also contain all of those
        /// nested properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns channelSection resources that match the API request criteria.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ChannelSectionListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more channelSection resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, and contentDetails.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a channelSection resource, the snippet property contains other
            /// properties, such as a display title for the channelSection. If you set part=snippet, the API response
            /// will also contain all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The channelId parameter specifies a YouTube channel ID. The API will only return that channel's
            /// channelSections.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>Set this parameter's value to true to retrieve a feed of the authenticated user's
            /// channelSections.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The hl parameter indicates that the snippet.localized property values in the returned
            /// channelSection resources should be in the specified language if localized values for that language are
            /// available. For example, if the API request specifies hl=de, the snippet.localized properties in the API
            /// response will contain German titles if German titles are available. Channel owners can provide localized
            /// channel section titles using either the channelSections.insert or channelSections.update
            /// method.</summary>
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube channelSection ID(s) for the
            /// resource(s) that are being retrieved. In a channelSection resource, the id property specifies the
            /// YouTube channelSection ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channelSections"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Update a channelSection.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and contentDetails.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.ChannelSection body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Update a channelSection.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ChannelSection>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.ChannelSection body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and contentDetails.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.ChannelSection Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channelSections"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "channels" collection of methods.</summary>
    public class ChannelsResource
    {
        private const string Resource = "channels";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ChannelsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a collection of zero or more channel resources that match the request criteria.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more channel resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id, snippet,
        /// contentDetails, statistics, topicDetails, and invideoPromotion.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a channel resource, the contentDetails property contains other properties, such as the
        /// uploads properties. As such, if you set part=contentDetails, the API response will also contain all of those nested
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a collection of zero or more channel resources that match the request criteria.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ChannelListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more channel resource properties
            /// that the API response will include. The part names that you can include in the parameter value are id,
            /// snippet, contentDetails, statistics, topicDetails, and invideoPromotion.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a channel resource, the contentDetails property contains other
            /// properties, such as the uploads properties. As such, if you set part=contentDetails, the API response
            /// will also contain all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Set this parameter's value to true to instruct the API to only return channels managed by the
            /// content owner that the onBehalfOfContentOwner parameter specifies. The user must be authenticated as a
            /// CMS account linked to the specified content owner and onBehalfOfContentOwner must be provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("managedByMe", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> ManagedByMe { get; set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The forUsername parameter specifies a YouTube username, thereby requesting the channel
            /// associated with that username.</summary>
            [Google.Apis.Util.RequestParameterAttribute("forUsername", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ForUsername { get; set; }

            /// <summary>Set this parameter's value to true to instruct the API to only return channels owned by the
            /// authenticated user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube channel ID(s) for the
            /// resource(s) that are being retrieved. In a channel resource, the id property specifies the channel's
            /// YouTube channel ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>Set this parameter's value to true to retrieve a list of channels that subscribed to the
            /// authenticated user's channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mySubscribers", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> MySubscribers { get; set; }

            /// <summary>The hl parameter should be used for filter out the properties that are not in the given
            /// language. Used for the brandingSettings part.</summary>
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }

            /// <summary>The categoryId parameter specifies a YouTube guide category, thereby requesting YouTube
            /// channels associated with that category.</summary>
            [Google.Apis.Util.RequestParameterAttribute("categoryId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string CategoryId { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channels"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "managedByMe", new Google.Apis.Discovery.Parameter
                    {
                        Name = "managedByMe",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "forUsername", new Google.Apis.Discovery.Parameter
                    {
                        Name = "forUsername",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mySubscribers", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mySubscribers",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "categoryId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "categoryId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a channel's metadata.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are id and invideoPromotion.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.Channel body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Updates a channel's metadata.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Channel>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Channel body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are id and invideoPromotion.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Channel Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "channels"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "commentThreads" collection of methods.</summary>
    public class CommentThreadsResource
    {
        private const string Resource = "commentThreads";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public CommentThreadsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Creates a new comment thread and top level comment.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are id and snippet. However only snippet contains
        /// properties that can be set.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.CommentThread body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Creates a new comment thread and top level comment.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.CommentThread>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.CommentThread body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are id and snippet. However only snippet
            /// contains properties that can be set.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The shareOnGooglePlus determines whether this thread should also be posted on
            /// Google+.</summary>
            /// [default: false]
            [Google.Apis.Util.RequestParameterAttribute("shareOnGooglePlus", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> ShareOnGooglePlus { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.CommentThread Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "commentThreads"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "shareOnGooglePlus", new Google.Apis.Discovery.Parameter
                    {
                        Name = "shareOnGooglePlus",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "false",
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a list of comment threads that match the API request parameters.</summary>
        /// <param name="part">The part parameter specifies the commentThread resource parts that the API response will include.
        /// Supported values are id, snippet and replies.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of comment threads that match the API request parameters.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.CommentThreadListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies the commentThread resource parts that the API response will
            /// include. Supported values are id, snippet and replies.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The searchTerms parameter instructs the API to limit the returned comments to those which
            /// contain the specified search terms.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("searchTerms", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string SearchTerms { get; set; }

            /// <summary>The allThreadsRelatedToChannelId parameter instructs the API to return the comment threads of
            /// all videos of the channel and the channel comments as well.</summary>
            [Google.Apis.Util.RequestParameterAttribute("allThreadsRelatedToChannelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string AllThreadsRelatedToChannelId { get; set; }

            /// <summary>The channelId parameter instructs the API to return the comment threads for all the channel
            /// comments (not including comments left on videos).</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>The videoId parameter instructs the API to return the comment threads for the video specified
            /// by the video id.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoId { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            /// [default: 20]
            /// [minimum: 1]
            /// [maximum: 100]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken property identifies the next page of the result that can be
            /// retrieved.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>Set this parameter to limit the returned comment threads to a particular moderation state.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            /// [default: published]
            [Google.Apis.Util.RequestParameterAttribute("moderationStatus", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<ModerationStatusEnum> ModerationStatus { get; set; }

            /// <summary>Set this parameter to limit the returned comment threads to a particular moderation state.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            public enum ModerationStatusEnum
            {
                /// <summary>Returns only comment threads awaiting review by a moderator.</summary>
                [Google.Apis.Util.StringValueAttribute("heldForReview")]
                HeldForReview,
                /// <summary>Returns only comment threads classified as likely being spam.</summary>
                [Google.Apis.Util.StringValueAttribute("likelySpam")]
                LikelySpam,
                /// <summary>Returns only published comment threads.</summary>
                [Google.Apis.Util.StringValueAttribute("published")]
                Published,
            }

            /// <summary>Set this parameter's value to html or plainText to instruct the API to return the comments left
            /// by users in html formatted or in plain text.</summary>
            /// [default: FORMAT_HTML]
            [Google.Apis.Util.RequestParameterAttribute("textFormat", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<TextFormatEnum> TextFormat { get; set; }

            /// <summary>Set this parameter's value to html or plainText to instruct the API to return the comments left
            /// by users in html formatted or in plain text.</summary>
            public enum TextFormatEnum
            {
                /// <summary>Returns the comments in HTML format.</summary>
                [Google.Apis.Util.StringValueAttribute("html")]
                Html,
                /// <summary>Returns the comments in plain text format.</summary>
                [Google.Apis.Util.StringValueAttribute("plainText")]
                PlainText,
            }

            /// <summary>The id parameter specifies a comma-separated list of comment thread IDs for the resources that
            /// should be retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "commentThreads"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "searchTerms", new Google.Apis.Discovery.Parameter
                    {
                        Name = "searchTerms",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "allThreadsRelatedToChannelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "allThreadsRelatedToChannelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "20",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "moderationStatus", new Google.Apis.Discovery.Parameter
                    {
                        Name = "moderationStatus",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "published",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "textFormat", new Google.Apis.Discovery.Parameter
                    {
                        Name = "textFormat",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "FORMAT_HTML",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Modifies an existing comment.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are id, snippet and replies. However only snippet
        /// contains properties that can be updated.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.CommentThread body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Modifies an existing comment.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.CommentThread>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.CommentThread body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are id, snippet and replies. However only
            /// snippet contains properties that can be updated.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.CommentThread Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "commentThreads"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "comments" collection of methods.</summary>
    public class CommentsResource
    {
        private const string Resource = "comments";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public CommentsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a comment.</summary>
        /// <param name="id">The id parameter specifies the comment ID for the resource that should be deleted.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a comment.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the comment ID for the resource that should be deleted.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Creates a new comment.
        ///
        /// Note: to create a top level comment it is also necessary to create a comment thread. Both are accomplished
        /// through the commentThreads resource.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are id and snippet. However only snippet contains
        /// properties that can be set.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Comment body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Creates a new comment.
        ///
        /// Note: to create a top level comment it is also necessary to create a comment thread. Both are accomplished
        /// through the commentThreads resource.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Comment>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Comment body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are id and snippet. However only snippet
            /// contains properties that can be set.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Comment Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a list of comments that match the API request parameters.</summary>
        /// <param name="part">The part parameter specifies the comment resource parts that the API response will include.
        /// Supported values are id and snippet.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of comments that match the API request parameters.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.CommentListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies the comment resource parts that the API response will include.
            /// Supported values are id and snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            /// [default: 20]
            /// [minimum: 1]
            /// [maximum: 100]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken property identifies the next page of the result that can be
            /// retrieved.
            ///
            /// Note: This parameter is not supported for use in conjunction with the id parameter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The parentId parameter specifies the ID of the comment for which replies should be retrieved.
            ///
            /// Note: Currently YouTube features only one level of replies (ie replies to top level comments). However
            /// replies to replies may be supported in the future.</summary>
            [Google.Apis.Util.RequestParameterAttribute("parentId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ParentId { get; set; }

            /// <summary>Set this parameter's value to html or plainText to instruct the API to return the comments left
            /// by users formatted as HTML or as plain text.</summary>
            /// [default: FORMAT_HTML]
            [Google.Apis.Util.RequestParameterAttribute("textFormat", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<TextFormatEnum> TextFormat { get; set; }

            /// <summary>Set this parameter's value to html or plainText to instruct the API to return the comments left
            /// by users formatted as HTML or as plain text.</summary>
            public enum TextFormatEnum
            {
                /// <summary>Returns the comments in HTML format.</summary>
                [Google.Apis.Util.StringValueAttribute("html")]
                Html,
                /// <summary>Returns the comments in plain text format.</summary>
                [Google.Apis.Util.StringValueAttribute("plainText")]
                PlainText,
            }

            /// <summary>The id parameter specifies a comma-separated list of comment IDs for the resources that should
            /// be retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "20",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "parentId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "parentId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "textFormat", new Google.Apis.Discovery.Parameter
                    {
                        Name = "textFormat",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "FORMAT_HTML",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Expresses the caller's opinion that a comment is spam.</summary>
        /// <param name="id">The id parameter specifies a comma-separated list of IDs of comments which should get flagged as
        /// spam.</param>
        public virtual MarkAsSpamRequest MarkAsSpam(string id)
        {
            return new MarkAsSpamRequest(service, id);
        }

        /// <summary>Expresses the caller's opinion that a comment is spam.</summary>
        public class MarkAsSpamRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new MarkAsSpam request.</summary>
            public MarkAsSpamRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies a comma-separated list of IDs of comments which should get flagged
            /// as spam.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "markAsSpam"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments/markAsSpam"; }
            }

            /// <summary>Initializes MarkAsSpam parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Sets the moderation status of one or more comments.</summary>
        /// <param name="id">The id parameter specifies a comma-separated list of IDs of comments whose moderation status should
        /// be updated.</param>
        /// <param name="moderationStatus">Determines the new moderation status of the specified
        /// comments.</param>
        public virtual SetModerationStatusRequest SetModerationStatus(string id, SetModerationStatusRequest.ModerationStatusEnum moderationStatus)
        {
            return new SetModerationStatusRequest(service, id, moderationStatus);
        }

        /// <summary>Sets the moderation status of one or more comments.</summary>
        public class SetModerationStatusRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new SetModerationStatus request.</summary>
            public SetModerationStatusRequest(Google.Apis.Services.IClientService service, string id, SetModerationStatusRequest.ModerationStatusEnum moderationStatus)
                : base(service)
            {
                Id = id;
                ModerationStatus = moderationStatus;
                InitParameters();
            }


            /// <summary>The id parameter specifies a comma-separated list of IDs of comments whose moderation status
            /// should be updated.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Determines the new moderation status of the specified comments.</summary>
            [Google.Apis.Util.RequestParameterAttribute("moderationStatus", Google.Apis.Util.RequestParameterType.Query)]
            public virtual ModerationStatusEnum ModerationStatus { get; private set; }

            /// <summary>Determines the new moderation status of the specified comments.</summary>
            public enum ModerationStatusEnum
            {
                /// <summary>Marks a comment as awaiting review by a moderator.</summary>
                [Google.Apis.Util.StringValueAttribute("heldForReview")]
                HeldForReview,
                /// <summary>Clears a comment for public display.</summary>
                [Google.Apis.Util.StringValueAttribute("published")]
                Published,
                /// <summary>Rejects a comment as not fit for display.
                ///
                /// Note: currently there is no way to list or otherwise discover a rejected comment. However it is
                /// possible to change its moderation status as long as its ID is still known.
                ///
                /// Note: Currently, if you reject a comment you effectively also hide all its replies as there is no
                /// longer any way to discover them. This may change in the future.</summary>
                [Google.Apis.Util.StringValueAttribute("rejected")]
                Rejected,
            }

            /// <summary>The banAuthor paramter, if set to true, adds the author of the comment to the ban list. This
            /// means all future comments of the author will autmomatically be rejected.
            ///
            /// Note: This parameter is only valid in combination with moderationStatus 'rejected'.</summary>
            /// [default: false]
            [Google.Apis.Util.RequestParameterAttribute("banAuthor", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> BanAuthor { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "setModerationStatus"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments/setModerationStatus"; }
            }

            /// <summary>Initializes SetModerationStatus parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "moderationStatus", new Google.Apis.Discovery.Parameter
                    {
                        Name = "moderationStatus",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "banAuthor", new Google.Apis.Discovery.Parameter
                    {
                        Name = "banAuthor",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "false",
                        Pattern = null,
                    });
            }

        }

        /// <summary>Modifies an existing comment.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are id and snippet. However only snippet contains
        /// properties that can be updated.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.Comment body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Modifies an existing comment.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Comment>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Comment body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are id and snippet. However only snippet
            /// contains properties that can be updated.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Comment Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "comments"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "guideCategories" collection of methods.</summary>
    public class GuideCategoriesResource
    {
        private const string Resource = "guideCategories";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public GuideCategoriesResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a list of categories that can be associated with YouTube channels.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more guideCategory resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id and
        /// snippet.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a guideCategory resource, the snippet property contains other properties, such as the
        /// category's title. If you set part=snippet, the API response will also contain all of those nested
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of categories that can be associated with YouTube channels.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.GuideCategoryListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more guideCategory resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id and snippet.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a guideCategory resource, the snippet property contains other
            /// properties, such as the category's title. If you set part=snippet, the API response will also contain
            /// all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The regionCode parameter instructs the API to return the list of guide categories available in
            /// the specified country. The parameter value is an ISO 3166-1 alpha-2 country code.</summary>
            [Google.Apis.Util.RequestParameterAttribute("regionCode", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RegionCode { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube channel category ID(s) for the
            /// resource(s) that are being retrieved. In a guideCategory resource, the id property specifies the YouTube
            /// channel category ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }

            /// <summary>The hl parameter specifies the language that will be used for text values in the API
            /// response.</summary>
            /// [default: en-US]
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "guideCategories"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "regionCode", new Google.Apis.Discovery.Parameter
                    {
                        Name = "regionCode",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "en-US",
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "i18nLanguages" collection of methods.</summary>
    public class I18nLanguagesResource
    {
        private const string Resource = "i18nLanguages";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public I18nLanguagesResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a list of supported languages.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more i18nLanguage resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id and
        /// snippet.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of supported languages.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.I18nLanguageListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more i18nLanguage resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id and snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The hl parameter specifies the language that should be used for text values in the API
            /// response.</summary>
            /// [default: en_US]
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "i18nLanguages"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "en_US",
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "i18nRegions" collection of methods.</summary>
    public class I18nRegionsResource
    {
        private const string Resource = "i18nRegions";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public I18nRegionsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a list of supported regions.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more i18nRegion resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id and
        /// snippet.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of supported regions.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.I18nRegionListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more i18nRegion resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id and snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The hl parameter specifies the language that should be used for text values in the API
            /// response.</summary>
            /// [default: en_US]
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "i18nRegions"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "en_US",
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "liveBroadcasts" collection of methods.</summary>
    public class LiveBroadcastsResource
    {
        private const string Resource = "liveBroadcasts";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public LiveBroadcastsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Binds a YouTube broadcast to a stream or removes an existing binding between a broadcast and a
        /// stream. A broadcast can only be bound to one video stream.</summary>
        /// <param name="id">The id parameter specifies the unique ID of the broadcast that is being bound to a video
        /// stream.</param>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more
        /// liveBroadcast resource properties that the API response will include. The part names that you can include in the
        /// parameter value are id, snippet, contentDetails, and status.</param>
        public virtual BindRequest Bind(string id, string part)
        {
            return new BindRequest(service, id, part);
        }

        /// <summary>Binds a YouTube broadcast to a stream or removes an existing binding between a broadcast and a
        /// stream. A broadcast can only be bound to one video stream.</summary>
        public class BindRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcast>
        {
            /// <summary>Constructs a new Bind request.</summary>
            public BindRequest(Google.Apis.Services.IClientService service, string id, string part)
                : base(service)
            {
                Id = id;
                Part = part;
                InitParameters();
            }


            /// <summary>The id parameter specifies the unique ID of the broadcast that is being bound to a video
            /// stream.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>The part parameter specifies a comma-separated list of one or more liveBroadcast resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, contentDetails, and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The streamId parameter specifies the unique ID of the video stream that is being bound to a
            /// broadcast. If this parameter is omitted, the API will remove any existing binding between the broadcast
            /// and a video stream.</summary>
            [Google.Apis.Util.RequestParameterAttribute("streamId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string StreamId { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "bind"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts/bind"; }
            }

            /// <summary>Initializes Bind parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "streamId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "streamId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Controls the settings for a slate that can be displayed in the broadcast stream.</summary>
        /// <param name="id">The id parameter specifies the YouTube live broadcast ID that uniquely identifies the broadcast in
        /// which the slate is being updated.</param>
        /// <param name="part">The part parameter specifies a comma-separated
        /// list of one or more liveBroadcast resource properties that the API response will include. The part names that you
        /// can include in the parameter value are id, snippet, contentDetails, and status.</param>
        public virtual ControlRequest Control(string id, string part)
        {
            return new ControlRequest(service, id, part);
        }

        /// <summary>Controls the settings for a slate that can be displayed in the broadcast stream.</summary>
        public class ControlRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcast>
        {
            /// <summary>Constructs a new Control request.</summary>
            public ControlRequest(Google.Apis.Services.IClientService service, string id, string part)
                : base(service)
            {
                Id = id;
                Part = part;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube live broadcast ID that uniquely identifies the broadcast
            /// in which the slate is being updated.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>The part parameter specifies a comma-separated list of one or more liveBroadcast resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, contentDetails, and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The displaySlate parameter specifies whether the slate is being enabled or disabled.</summary>
            [Google.Apis.Util.RequestParameterAttribute("displaySlate", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> DisplaySlate { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The offsetTimeMs parameter specifies a positive time offset when the specified slate change
            /// will occur. The value is measured in milliseconds from the beginning of the broadcast's monitor stream,
            /// which is the time that the testing phase for the broadcast began. Even though it is specified in
            /// milliseconds, the value is actually an approximation, and YouTube completes the requested action as
            /// closely as possible to that time.
            ///
            /// If you do not specify a value for this parameter, then YouTube performs the action as soon as possible.
            /// See the Getting started guide for more details.
            ///
            /// Important: You should only specify a value for this parameter if your broadcast stream is
            /// delayed.</summary>
            [Google.Apis.Util.RequestParameterAttribute("offsetTimeMs", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<ulong> OffsetTimeMs { get; set; }

            /// <summary>The walltime parameter specifies the wall clock time at which the specified slate change will
            /// occur. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sssZ) format.</summary>
            [Google.Apis.Util.RequestParameterAttribute("walltime", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<System.DateTime> Walltime { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "control"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts/control"; }
            }

            /// <summary>Initializes Control parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "displaySlate", new Google.Apis.Discovery.Parameter
                    {
                        Name = "displaySlate",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "offsetTimeMs", new Google.Apis.Discovery.Parameter
                    {
                        Name = "offsetTimeMs",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "walltime", new Google.Apis.Discovery.Parameter
                    {
                        Name = "walltime",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Deletes a broadcast.</summary>
        /// <param name="id">The id parameter specifies the YouTube live broadcast ID for the resource that is being
        /// deleted.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a broadcast.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube live broadcast ID for the resource that is being
            /// deleted.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Creates a broadcast.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part properties that you can include in the parameter value are id, snippet, contentDetails, and
        /// status.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.LiveBroadcast body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Creates a broadcast.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcast>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.LiveBroadcast body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part properties that you can include in the parameter value are id, snippet, contentDetails, and
            /// status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.LiveBroadcast Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a list of YouTube broadcasts that match the API request parameters.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more liveBroadcast resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id,
        /// snippet, contentDetails, and status.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of YouTube broadcasts that match the API request parameters.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcastListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more liveBroadcast resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, contentDetails, and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The broadcastStatus parameter filters the API response to only include broadcasts with the
            /// specified status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("broadcastStatus", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<BroadcastStatusEnum> BroadcastStatus { get; set; }

            /// <summary>The broadcastStatus parameter filters the API response to only include broadcasts with the
            /// specified status.</summary>
            public enum BroadcastStatusEnum
            {
                /// <summary>Return current live broadcasts.</summary>
                [Google.Apis.Util.StringValueAttribute("active")]
                Active,
                /// <summary>Return all broadcasts.</summary>
                [Google.Apis.Util.StringValueAttribute("all")]
                All,
                /// <summary>Return broadcasts that have already ended.</summary>
                [Google.Apis.Util.StringValueAttribute("completed")]
                Completed,
                /// <summary>Return broadcasts that have not yet started.</summary>
                [Google.Apis.Util.StringValueAttribute("upcoming")]
                Upcoming,
            }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The mine parameter can be used to instruct the API to only return broadcasts owned by the
            /// authenticated user. Set the parameter value to true to only retrieve your own broadcasts.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of YouTube broadcast IDs that identify the
            /// broadcasts being retrieved. In a liveBroadcast resource, the id property specifies the broadcast's
            /// ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "broadcastStatus", new Google.Apis.Discovery.Parameter
                    {
                        Name = "broadcastStatus",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Changes the status of a YouTube live broadcast and initiates any processes associated with the new
        /// status. For example, when you transition a broadcast's status to testing, YouTube starts to transmit video
        /// to that broadcast's monitor stream. Before calling this method, you should confirm that the value of the
        /// status.streamStatus property for the stream bound to your broadcast is active.</summary>
        /// <param name="broadcastStatus">The broadcastStatus parameter identifies the state to which the broadcast is changing.
        /// Note that to transition a broadcast to either the testing or live state, the status.streamStatus must be active for
        /// the stream that the broadcast is bound to.</param>
        /// <param name="id">The id parameter specifies the unique ID
        /// of the broadcast that is transitioning to another status.</param>
        /// <param name="part">The part parameter
        /// specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will
        /// include. The part names that you can include in the parameter value are id, snippet, contentDetails, and
        /// status.</param>
        public virtual TransitionRequest Transition(TransitionRequest.BroadcastStatusEnum broadcastStatus, string id, string part)
        {
            return new TransitionRequest(service, broadcastStatus, id, part);
        }

        /// <summary>Changes the status of a YouTube live broadcast and initiates any processes associated with the new
        /// status. For example, when you transition a broadcast's status to testing, YouTube starts to transmit video
        /// to that broadcast's monitor stream. Before calling this method, you should confirm that the value of the
        /// status.streamStatus property for the stream bound to your broadcast is active.</summary>
        public class TransitionRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcast>
        {
            /// <summary>Constructs a new Transition request.</summary>
            public TransitionRequest(Google.Apis.Services.IClientService service, TransitionRequest.BroadcastStatusEnum broadcastStatus, string id, string part)
                : base(service)
            {
                BroadcastStatus = broadcastStatus;
                Id = id;
                Part = part;
                InitParameters();
            }


            /// <summary>The broadcastStatus parameter identifies the state to which the broadcast is changing. Note
            /// that to transition a broadcast to either the testing or live state, the status.streamStatus must be
            /// active for the stream that the broadcast is bound to.</summary>
            [Google.Apis.Util.RequestParameterAttribute("broadcastStatus", Google.Apis.Util.RequestParameterType.Query)]
            public virtual BroadcastStatusEnum BroadcastStatus { get; private set; }

            /// <summary>The broadcastStatus parameter identifies the state to which the broadcast is changing. Note
            /// that to transition a broadcast to either the testing or live state, the status.streamStatus must be
            /// active for the stream that the broadcast is bound to.</summary>
            public enum BroadcastStatusEnum
            {
                /// <summary>The broadcast is over. YouTube stops transmitting video.</summary>
                [Google.Apis.Util.StringValueAttribute("complete")]
                Complete,
                /// <summary>The broadcast is visible to its audience. YouTube transmits video to the broadcast's
                /// monitor stream and its broadcast stream.</summary>
                [Google.Apis.Util.StringValueAttribute("live")]
                Live,
                /// <summary>Start testing the broadcast. YouTube transmits video to the broadcast's monitor stream.
                /// Note that you can only transition a broadcast to the testing state if its
                /// contentDetails.monitorStream.enableMonitorStream property is set to true.</summary>
                [Google.Apis.Util.StringValueAttribute("testing")]
                Testing,
            }

            /// <summary>The id parameter specifies the unique ID of the broadcast that is transitioning to another
            /// status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>The part parameter specifies a comma-separated list of one or more liveBroadcast resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, contentDetails, and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "transition"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts/transition"; }
            }

            /// <summary>Initializes Transition parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "broadcastStatus", new Google.Apis.Discovery.Parameter
                    {
                        Name = "broadcastStatus",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a broadcast. For example, you could modify the broadcast settings defined in the
        /// liveBroadcast resource's contentDetails object.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part properties that you can include in the parameter value are id, snippet, contentDetails, and status.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part.
        /// As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value
        /// includes the status part, the broadcast's privacy setting will be updated to whatever value the request body
        /// specifies. If the request body does not specify a value, the existing privacy setting will be removed and the
        /// broadcast will revert to the default privacy setting.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.LiveBroadcast body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Updates a broadcast. For example, you could modify the broadcast settings defined in the
        /// liveBroadcast resource's contentDetails object.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveBroadcast>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.LiveBroadcast body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part properties that you can include in the parameter value are id, snippet, contentDetails, and
            /// status.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is
            /// defined in the status part. As such, if your request is updating a private or unlisted broadcast, and
            /// the request's part parameter value includes the status part, the broadcast's privacy setting will be
            /// updated to whatever value the request body specifies. If the request body does not specify a value, the
            /// existing privacy setting will be removed and the broadcast will revert to the default privacy
            /// setting.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.LiveBroadcast Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveBroadcasts"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "liveStreams" collection of methods.</summary>
    public class LiveStreamsResource
    {
        private const string Resource = "liveStreams";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public LiveStreamsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a video stream.</summary>
        /// <param name="id">The id parameter specifies the YouTube live stream ID for the resource that is being
        /// deleted.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a video stream.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube live stream ID for the resource that is being
            /// deleted.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveStreams"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Creates a video stream. The stream enables you to send your video to YouTube, which can then
        /// broadcast the video to your audience.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part properties that you can include in the parameter value are id, snippet, cdn, and status.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.LiveStream body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Creates a video stream. The stream enables you to send your video to YouTube, which can then
        /// broadcast the video to your audience.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveStream>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.LiveStream body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part properties that you can include in the parameter value are id, snippet, cdn, and
            /// status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.LiveStream Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveStreams"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a list of video streams that match the API request parameters.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more liveStream resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id, snippet, cdn,
        /// and status.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of video streams that match the API request parameters.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveStreamListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more liveStream resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, cdn, and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The mine parameter can be used to instruct the API to only return streams owned by the
            /// authenticated user. Set the parameter value to true to only retrieve your own streams.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set. Acceptable values are 0 to 50, inclusive. The default value is 5.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of YouTube stream IDs that identify the
            /// streams being retrieved. In a liveStream resource, the id property specifies the stream's ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveStreams"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a video stream. If the properties that you want to change cannot be updated, then you need
        /// to create a new stream with the proper settings.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part properties that you can include in the parameter value are id, snippet, cdn, and status.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies. If the request body does not specify a value for a mutable property, the
        /// existing value for that property will be removed.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.LiveStream body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Updates a video stream. If the properties that you want to change cannot be updated, then you need
        /// to create a new stream with the proper settings.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.LiveStream>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.LiveStream body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part properties that you can include in the parameter value are id, snippet, cdn, and status.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies. If the request body does not specify a value
            /// for a mutable property, the existing value for that property will be removed.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.LiveStream Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "liveStreams"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "playlistItems" collection of methods.</summary>
    public class PlaylistItemsResource
    {
        private const string Resource = "playlistItems";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public PlaylistItemsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a playlist item.</summary>
        /// <param name="id">The id parameter specifies the YouTube playlist item ID for the playlist item that is being
        /// deleted. In a playlistItem resource, the id property specifies the playlist item's ID.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a playlist item.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube playlist item ID for the playlist item that is being
            /// deleted. In a playlistItem resource, the id property specifies the playlist item's ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlistItems"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Adds a resource to a playlist.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet, contentDetails, and status.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.PlaylistItem body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Adds a resource to a playlist.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.PlaylistItem>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.PlaylistItem body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet, contentDetails, and
            /// status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.PlaylistItem Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlistItems"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a collection of playlist items that match the API request parameters. You can retrieve all
        /// of the playlist items in a specified playlist or retrieve one or more playlist items by their unique
        /// IDs.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more playlistItem resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id,
        /// snippet, contentDetails, and status.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a playlistItem resource, the snippet property contains numerous fields, including the
        /// title, description, position, and resourceId properties. As such, if you set part=snippet, the API response will
        /// contain all of those properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a collection of playlist items that match the API request parameters. You can retrieve all
        /// of the playlist items in a specified playlist or retrieve one or more playlist items by their unique
        /// IDs.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.PlaylistItemListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more playlistItem resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, contentDetails, and status.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a playlistItem resource, the snippet property contains
            /// numerous fields, including the title, description, position, and resourceId properties. As such, if you
            /// set part=snippet, the API response will contain all of those properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The playlistId parameter specifies the unique ID of the playlist for which you want to retrieve
            /// playlist items. Note that even though this is an optional parameter, every request to retrieve playlist
            /// items must specify a value for either the id parameter or the playlistId parameter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("playlistId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PlaylistId { get; set; }

            /// <summary>The videoId parameter specifies that the request should return only the playlist items that
            /// contain the specified video.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoId { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of one or more unique playlist item
            /// IDs.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlistItems"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "playlistId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "playlistId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Modifies a playlist item. For example, you could update the item's position in the
        /// playlist.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet, contentDetails, and status.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies. For example, a playlist item can specify a start time and end time, which
        /// identify the times portion of the video that should play when users watch the video in the playlist. If your request
        /// is updating a playlist item that sets these values, and the request's part parameter value includes the
        /// contentDetails part, the playlist item's start and end times will be updated to whatever value the request body
        /// specifies. If the request body does not specify values, the existing start and end times will be removed and
        /// replaced with the default settings.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.PlaylistItem body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Modifies a playlist item. For example, you could update the item's position in the
        /// playlist.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.PlaylistItem>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.PlaylistItem body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet, contentDetails, and status.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies. For example, a playlist item can specify a
            /// start time and end time, which identify the times portion of the video that should play when users watch
            /// the video in the playlist. If your request is updating a playlist item that sets these values, and the
            /// request's part parameter value includes the contentDetails part, the playlist item's start and end times
            /// will be updated to whatever value the request body specifies. If the request body does not specify
            /// values, the existing start and end times will be removed and replaced with the default
            /// settings.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.PlaylistItem Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlistItems"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "playlists" collection of methods.</summary>
    public class PlaylistsResource
    {
        private const string Resource = "playlists";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public PlaylistsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a playlist.</summary>
        /// <param name="id">The id parameter specifies the YouTube playlist ID for the playlist that is being deleted. In a
        /// playlist resource, the id property specifies the playlist's ID.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a playlist.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube playlist ID for the playlist that is being deleted. In a
            /// playlist resource, the id property specifies the playlist's ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlists"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Creates a playlist.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and status.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Playlist body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Creates a playlist.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Playlist>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Playlist body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and status.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Playlist Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlists"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns a collection of playlists that match the API request parameters. For example, you can
        /// retrieve all playlists that the authenticated user owns, or you can retrieve one or more playlists by their
        /// unique IDs.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more playlist resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id, snippet,
        /// status, and contentDetails.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a playlist resource, the snippet property contains properties like author, title,
        /// description, tags, and timeCreated. As such, if you set part=snippet, the API response will contain all of those
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a collection of playlists that match the API request parameters. For example, you can
        /// retrieve all playlists that the authenticated user owns, or you can retrieve one or more playlists by their
        /// unique IDs.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.PlaylistListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more playlist resource properties
            /// that the API response will include. The part names that you can include in the parameter value are id,
            /// snippet, status, and contentDetails.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a playlist resource, the snippet property contains properties
            /// like author, title, description, tags, and timeCreated. As such, if you set part=snippet, the API
            /// response will contain all of those properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>This value indicates that the API should only return the specified channel's
            /// playlists.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>Set this parameter's value to true to instruct the API to only return playlists owned by the
            /// authenticated user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The hl parameter should be used for filter out the properties that are not in the given
            /// language. Used for the snippet part.</summary>
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube playlist ID(s) for the
            /// resource(s) that are being retrieved. In a playlist resource, the id property specifies the playlist's
            /// YouTube playlist ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlists"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Modifies a playlist. For example, you could change a playlist's title, description, or privacy
        /// status.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and status.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies. For example, a playlist's privacy setting is contained in the status part.
        /// As such, if your request is updating a private playlist, and the request's part parameter value includes the status
        /// part, the playlist's privacy setting will be updated to whatever value the request body specifies. If the request
        /// body does not specify a value, the existing privacy setting will be removed and the playlist will revert to the
        /// default privacy setting.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.Playlist body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Modifies a playlist. For example, you could change a playlist's title, description, or privacy
        /// status.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Playlist>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Playlist body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and status.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies. For example, a playlist's privacy setting is
            /// contained in the status part. As such, if your request is updating a private playlist, and the request's
            /// part parameter value includes the status part, the playlist's privacy setting will be updated to
            /// whatever value the request body specifies. If the request body does not specify a value, the existing
            /// privacy setting will be removed and the playlist will revert to the default privacy setting.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Playlist Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "playlists"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "search" collection of methods.</summary>
    public class SearchResource
    {
        private const string Resource = "search";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public SearchResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a collection of search results that match the query parameters specified in the API
        /// request. By default, a search result set identifies matching video, channel, and playlist resources, but you
        /// can also configure queries to only retrieve a specific type of resource.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more search resource properties
        /// that the API response will include. The part names that you can include in the parameter value are id and snippet.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a search result, the snippet property contains other properties that identify the result's
        /// title, description, and so forth. If you set part=snippet, the API response will also contain all of those nested
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a collection of search results that match the query parameters specified in the API
        /// request. By default, a search result set identifies matching video, channel, and playlist resources, but you
        /// can also configure queries to only retrieve a specific type of resource.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.SearchListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more search resource properties
            /// that the API response will include. The part names that you can include in the parameter value are id
            /// and snippet.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a search result, the snippet property contains other
            /// properties that identify the result's title, description, and so forth. If you set part=snippet, the API
            /// response will also contain all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The eventType parameter restricts a search to broadcast events.</summary>
            [Google.Apis.Util.RequestParameterAttribute("eventType", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<EventTypeEnum> EventType { get; set; }

            /// <summary>The eventType parameter restricts a search to broadcast events.</summary>
            public enum EventTypeEnum
            {
                /// <summary>Only include completed broadcasts.</summary>
                [Google.Apis.Util.StringValueAttribute("completed")]
                Completed,
                /// <summary>Only include active broadcasts.</summary>
                [Google.Apis.Util.StringValueAttribute("live")]
                Live,
                /// <summary>Only include upcoming broadcasts.</summary>
                [Google.Apis.Util.StringValueAttribute("upcoming")]
                Upcoming,
            }

            /// <summary>The channelId parameter indicates that the API response should only contain resources created
            /// by the channel</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>The forDeveloper parameter restricts the search to only retrieve videos uploaded via the
            /// developer's application or website. The API server uses the request's authorization credentials to
            /// identify the developer. Therefore, a developer can restrict results to videos uploaded through the
            /// developer's own app or website but not to videos uploaded through other apps or sites.</summary>
            [Google.Apis.Util.RequestParameterAttribute("forDeveloper", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> ForDeveloper { get; set; }

            /// <summary>The videoSyndicated parameter lets you to restrict a search to only videos that can be played
            /// outside youtube.com.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoSyndicated", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoSyndicatedEnum> VideoSyndicated { get; set; }

            /// <summary>The videoSyndicated parameter lets you to restrict a search to only videos that can be played
            /// outside youtube.com.</summary>
            public enum VideoSyndicatedEnum
            {
                /// <summary>Return all videos, syndicated or not.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only retrieve syndicated videos.</summary>
                [Google.Apis.Util.StringValueAttribute("true")]
                True,
            }

            /// <summary>The channelType parameter lets you restrict a search to a particular type of channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelType", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<ChannelTypeEnum> ChannelType { get; set; }

            /// <summary>The channelType parameter lets you restrict a search to a particular type of channel.</summary>
            public enum ChannelTypeEnum
            {
                /// <summary>Return all channels.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only retrieve shows.</summary>
                [Google.Apis.Util.StringValueAttribute("show")]
                Show,
            }

            /// <summary>The videoCaption parameter indicates whether the API should filter video search results based
            /// on whether they have captions.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoCaption", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoCaptionEnum> VideoCaption { get; set; }

            /// <summary>The videoCaption parameter indicates whether the API should filter video search results based
            /// on whether they have captions.</summary>
            public enum VideoCaptionEnum
            {
                /// <summary>Do not filter results based on caption availability.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only include videos that have captions.</summary>
                [Google.Apis.Util.StringValueAttribute("closedCaption")]
                ClosedCaption,
                /// <summary>Only include videos that do not have captions.</summary>
                [Google.Apis.Util.StringValueAttribute("none")]
                None,
            }

            /// <summary>The publishedAfter parameter indicates that the API response should only contain resources
            /// created after the specified time. The value is an RFC 3339 formatted date-time value
            /// (1970-01-01T00:00:00Z).</summary>
            [Google.Apis.Util.RequestParameterAttribute("publishedAfter", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<System.DateTime> PublishedAfter { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The forContentOwner parameter restricts the search to only retrieve resources owned by the content owner
            /// specified by the onBehalfOfContentOwner parameter. The user must be authenticated using a CMS account
            /// linked to the specified content owner and onBehalfOfContentOwner must be provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("forContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> ForContentOwner { get; set; }

            /// <summary>The regionCode parameter instructs the API to return search results for the specified country.
            /// The parameter value is an ISO 3166-1 alpha-2 country code.</summary>
            [Google.Apis.Util.RequestParameterAttribute("regionCode", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RegionCode { get; set; }

            /// <summary>The location parameter restricts a search to videos that have a geographical location specified
            /// in their metadata. The value is a string that specifies geographic latitude/longitude coordinates e.g.
            /// (37.42307,-122.08427)</summary>
            [Google.Apis.Util.RequestParameterAttribute("location", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Location { get; set; }

            /// <summary>The locationRadius, in conjunction with the location parameter, defines a geographic area. If
            /// the geographic coordinates associated with a video fall within that area, then the video may be included
            /// in search results. This parameter value must be a floating point number followed by a measurement unit.
            /// Valid measurement units are m, km, ft, and mi. For example, valid parameter values include 1500m, 5km,
            /// 10000ft, and 0.75mi. The API does not support locationRadius parameter values larger than 1000
            /// kilometers.</summary>
            [Google.Apis.Util.RequestParameterAttribute("locationRadius", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string LocationRadius { get; set; }

            /// <summary>The videoType parameter lets you restrict a search to a particular type of videos.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoType", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoTypeEnum> VideoType { get; set; }

            /// <summary>The videoType parameter lets you restrict a search to a particular type of videos.</summary>
            public enum VideoTypeEnum
            {
                /// <summary>Return all videos.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only retrieve episodes of shows.</summary>
                [Google.Apis.Util.StringValueAttribute("episode")]
                Episode,
                /// <summary>Only retrieve movies.</summary>
                [Google.Apis.Util.StringValueAttribute("movie")]
                Movie,
            }

            /// <summary>The type parameter restricts a search query to only retrieve a particular type of resource. The
            /// value is a comma-separated list of resource types.</summary>
            /// [default: video,channel,playlist]
            [Google.Apis.Util.RequestParameterAttribute("type", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Type { get; set; }

            /// <summary>The topicId parameter indicates that the API response should only contain resources associated
            /// with the specified topic. The value identifies a Freebase topic ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("topicId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string TopicId { get; set; }

            /// <summary>The publishedBefore parameter indicates that the API response should only contain resources
            /// created before the specified time. The value is an RFC 3339 formatted date-time value
            /// (1970-01-01T00:00:00Z).</summary>
            [Google.Apis.Util.RequestParameterAttribute("publishedBefore", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<System.DateTime> PublishedBefore { get; set; }

            /// <summary>The videoDimension parameter lets you restrict a search to only retrieve 2D or 3D
            /// videos.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoDimension", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoDimensionEnum> VideoDimension { get; set; }

            /// <summary>The videoDimension parameter lets you restrict a search to only retrieve 2D or 3D
            /// videos.</summary>
            public enum VideoDimensionEnum
            {
                /// <summary>Restrict search results to exclude 3D videos.</summary>
                [Google.Apis.Util.StringValueAttribute("2d")]
                Value2d,
                /// <summary>Restrict search results to only include 3D videos.</summary>
                [Google.Apis.Util.StringValueAttribute("3d")]
                Value3d,
                /// <summary>Include both 3D and non-3D videos in returned results. This is the default value.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
            }

            /// <summary>The videoLicense parameter filters search results to only include videos with a particular
            /// license. YouTube lets video uploaders choose to attach either the Creative Commons license or the
            /// standard YouTube license to each of their videos.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoLicense", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoLicenseEnum> VideoLicense { get; set; }

            /// <summary>The videoLicense parameter filters search results to only include videos with a particular
            /// license. YouTube lets video uploaders choose to attach either the Creative Commons license or the
            /// standard YouTube license to each of their videos.</summary>
            public enum VideoLicenseEnum
            {
                /// <summary>Return all videos, regardless of which license they have, that match the query
                /// parameters.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only return videos that have a Creative Commons license. Users can reuse videos with this
                /// license in other videos that they create. Learn more.</summary>
                [Google.Apis.Util.StringValueAttribute("creativeCommon")]
                CreativeCommon,
                /// <summary>Only return videos that have the standard YouTube license.</summary>
                [Google.Apis.Util.StringValueAttribute("youtube")]
                Youtube,
            }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The relatedToVideoId parameter retrieves a list of videos that are related to the video that
            /// the parameter value identifies. The parameter value must be set to a YouTube video ID and, if you are
            /// using this parameter, the type parameter must be set to video.</summary>
            [Google.Apis.Util.RequestParameterAttribute("relatedToVideoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RelatedToVideoId { get; set; }

            /// <summary>The videoDefinition parameter lets you restrict a search to only include either high definition
            /// (HD) or standard definition (SD) videos. HD videos are available for playback in at least 720p, though
            /// higher resolutions, like 1080p, might also be available.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoDefinition", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoDefinitionEnum> VideoDefinition { get; set; }

            /// <summary>The videoDefinition parameter lets you restrict a search to only include either high definition
            /// (HD) or standard definition (SD) videos. HD videos are available for playback in at least 720p, though
            /// higher resolutions, like 1080p, might also be available.</summary>
            public enum VideoDefinitionEnum
            {
                /// <summary>Return all videos, regardless of their resolution.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only retrieve HD videos.</summary>
                [Google.Apis.Util.StringValueAttribute("high")]
                High,
                /// <summary>Only retrieve videos in standard definition.</summary>
                [Google.Apis.Util.StringValueAttribute("standard")]
                Standard,
            }

            /// <summary>The videoDuration parameter filters video search results based on their duration.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoDuration", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoDurationEnum> VideoDuration { get; set; }

            /// <summary>The videoDuration parameter filters video search results based on their duration.</summary>
            public enum VideoDurationEnum
            {
                /// <summary>Do not filter video search results based on their duration. This is the default
                /// value.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only include videos longer than 20 minutes.</summary>
                [Google.Apis.Util.StringValueAttribute("long")]
                Long,
                /// <summary>Only include videos that are between four and 20 minutes long (inclusive).</summary>
                [Google.Apis.Util.StringValueAttribute("medium")]
                Medium,
                /// <summary>Only include videos that are less than four minutes long.</summary>
                [Google.Apis.Util.StringValueAttribute("short")]
                Short,
            }

            /// <summary>The relevanceLanguage parameter instructs the API to return search results that are most
            /// relevant to the specified language. The parameter value is typically an ISO 639-1 two-letter language
            /// code. However, you should use the values zh-Hans for simplified Chinese and zh-Hant for traditional
            /// Chinese. Please note that results in other languages will still be returned if they are highly relevant
            /// to the search query term.</summary>
            [Google.Apis.Util.RequestParameterAttribute("relevanceLanguage", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RelevanceLanguage { get; set; }

            /// <summary>The forMine parameter restricts the search to only retrieve videos owned by the authenticated
            /// user. If you set this parameter to true, then the type parameter's value must also be set to
            /// video.</summary>
            [Google.Apis.Util.RequestParameterAttribute("forMine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> ForMine { get; set; }

            /// <summary>The q parameter specifies the query term to search for.</summary>
            [Google.Apis.Util.RequestParameterAttribute("q", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Q { get; set; }

            /// <summary>The safeSearch parameter indicates whether the search results should include restricted content
            /// as well as standard content.</summary>
            [Google.Apis.Util.RequestParameterAttribute("safeSearch", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<SafeSearchEnum> SafeSearch { get; set; }

            /// <summary>The safeSearch parameter indicates whether the search results should include restricted content
            /// as well as standard content.</summary>
            public enum SafeSearchEnum
            {
                /// <summary>YouTube will filter some content from search results and, at the least, will filter content
                /// that is restricted in your locale. Based on their content, search results could be removed from
                /// search results or demoted in search results. This is the default parameter value.</summary>
                [Google.Apis.Util.StringValueAttribute("moderate")]
                Moderate,
                /// <summary>YouTube will not filter the search result set.</summary>
                [Google.Apis.Util.StringValueAttribute("none")]
                None,
                /// <summary>YouTube will try to exclude all restricted content from the search result set. Based on
                /// their content, search results could be removed from search results or demoted in search
                /// results.</summary>
                [Google.Apis.Util.StringValueAttribute("strict")]
                Strict,
            }

            /// <summary>The videoEmbeddable parameter lets you to restrict a search to only videos that can be embedded
            /// into a webpage.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoEmbeddable", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<VideoEmbeddableEnum> VideoEmbeddable { get; set; }

            /// <summary>The videoEmbeddable parameter lets you to restrict a search to only videos that can be embedded
            /// into a webpage.</summary>
            public enum VideoEmbeddableEnum
            {
                /// <summary>Return all videos, embeddable or not.</summary>
                [Google.Apis.Util.StringValueAttribute("any")]
                Any,
                /// <summary>Only retrieve embeddable videos.</summary>
                [Google.Apis.Util.StringValueAttribute("true")]
                True,
            }

            /// <summary>The videoCategoryId parameter filters video search results based on their category.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoCategoryId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoCategoryId { get; set; }

            /// <summary>The order parameter specifies the method that will be used to order resources in the API
            /// response.</summary>
            /// [default: SEARCH_SORT_RELEVANCE]
            [Google.Apis.Util.RequestParameterAttribute("order", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<OrderEnum> Order { get; set; }

            /// <summary>The order parameter specifies the method that will be used to order resources in the API
            /// response.</summary>
            public enum OrderEnum
            {
                /// <summary>Resources are sorted in reverse chronological order based on the date they were
                /// created.</summary>
                [Google.Apis.Util.StringValueAttribute("date")]
                Date,
                /// <summary>Resources are sorted from highest to lowest rating.</summary>
                [Google.Apis.Util.StringValueAttribute("rating")]
                Rating,
                /// <summary>Resources are sorted based on their relevance to the search query. This is the default
                /// value for this parameter.</summary>
                [Google.Apis.Util.StringValueAttribute("relevance")]
                Relevance,
                /// <summary>Resources are sorted alphabetically by title.</summary>
                [Google.Apis.Util.StringValueAttribute("title")]
                Title,
                /// <summary>Channels are sorted in descending order of their number of uploaded videos.</summary>
                [Google.Apis.Util.StringValueAttribute("videoCount")]
                VideoCount,
                /// <summary>Resources are sorted from highest to lowest number of views.</summary>
                [Google.Apis.Util.StringValueAttribute("viewCount")]
                ViewCount,
            }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "search"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "eventType", new Google.Apis.Discovery.Parameter
                    {
                        Name = "eventType",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "forDeveloper", new Google.Apis.Discovery.Parameter
                    {
                        Name = "forDeveloper",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoSyndicated", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoSyndicated",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelType", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelType",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoCaption", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoCaption",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "publishedAfter", new Google.Apis.Discovery.Parameter
                    {
                        Name = "publishedAfter",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "forContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "forContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "regionCode", new Google.Apis.Discovery.Parameter
                    {
                        Name = "regionCode",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "location", new Google.Apis.Discovery.Parameter
                    {
                        Name = "location",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "locationRadius", new Google.Apis.Discovery.Parameter
                    {
                        Name = "locationRadius",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoType", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoType",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "type", new Google.Apis.Discovery.Parameter
                    {
                        Name = "type",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "video,channel,playlist",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "topicId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "topicId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "publishedBefore", new Google.Apis.Discovery.Parameter
                    {
                        Name = "publishedBefore",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoDimension", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoDimension",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoLicense", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoLicense",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "relatedToVideoId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "relatedToVideoId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoDefinition", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoDefinition",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoDuration", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoDuration",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "relevanceLanguage", new Google.Apis.Discovery.Parameter
                    {
                        Name = "relevanceLanguage",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "forMine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "forMine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "q", new Google.Apis.Discovery.Parameter
                    {
                        Name = "q",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "safeSearch", new Google.Apis.Discovery.Parameter
                    {
                        Name = "safeSearch",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoEmbeddable", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoEmbeddable",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoCategoryId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoCategoryId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "order", new Google.Apis.Discovery.Parameter
                    {
                        Name = "order",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "SEARCH_SORT_RELEVANCE",
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "subscriptions" collection of methods.</summary>
    public class SubscriptionsResource
    {
        private const string Resource = "subscriptions";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public SubscriptionsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a subscription.</summary>
        /// <param name="id">The id parameter specifies the YouTube subscription ID for the resource that is being deleted. In a
        /// subscription resource, the id property specifies the YouTube subscription ID.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a subscription.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube subscription ID for the resource that is being deleted.
            /// In a subscription resource, the id property specifies the YouTube subscription ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "subscriptions"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Adds a subscription for the authenticated user's channel.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet and contentDetails.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Subscription body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Adds a subscription for the authenticated user's channel.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Subscription>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Subscription body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet and contentDetails.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Subscription Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "subscriptions"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Returns subscription resources that match the API request criteria.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more subscription resource
        /// properties that the API response will include. The part names that you can include in the parameter value are id,
        /// snippet, and contentDetails.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a subscription resource, the snippet property contains other properties, such as a display
        /// title for the subscription. If you set part=snippet, the API response will also contain all of those nested
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns subscription resources that match the API request criteria.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.SubscriptionListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more subscription resource
            /// properties that the API response will include. The part names that you can include in the parameter
            /// value are id, snippet, and contentDetails.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a subscription resource, the snippet property contains other
            /// properties, such as a display title for the subscription. If you set part=snippet, the API response will
            /// also contain all of those nested properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The channelId parameter specifies a YouTube channel ID. The API will only return that channel's
            /// subscriptions.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; set; }

            /// <summary>Set this parameter's value to true to retrieve a feed of the authenticated user's
            /// subscriptions.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mine", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Mine { get; set; }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.</summary>
            /// [default: 5]
            /// [minimum: 0]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The forChannelId parameter specifies a comma-separated list of channel IDs. The API response
            /// will then only contain subscriptions matching those channels.</summary>
            [Google.Apis.Util.RequestParameterAttribute("forChannelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ForChannelId { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>Set this parameter's value to true to retrieve a feed of the subscribers of the authenticated
            /// user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("mySubscribers", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> MySubscribers { get; set; }

            /// <summary>The order parameter specifies the method that will be used to sort resources in the API
            /// response.</summary>
            /// [default: SUBSCRIPTION_ORDER_RELEVANCE]
            [Google.Apis.Util.RequestParameterAttribute("order", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<OrderEnum> Order { get; set; }

            /// <summary>The order parameter specifies the method that will be used to sort resources in the API
            /// response.</summary>
            public enum OrderEnum
            {
                /// <summary>Sort alphabetically.</summary>
                [Google.Apis.Util.StringValueAttribute("alphabetical")]
                Alphabetical,
                /// <summary>Sort by relevance.</summary>
                [Google.Apis.Util.StringValueAttribute("relevance")]
                Relevance,
                /// <summary>Sort by order of activity.</summary>
                [Google.Apis.Util.StringValueAttribute("unread")]
                Unread,
            }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube subscription ID(s) for the
            /// resource(s) that are being retrieved. In a subscription resource, the id property specifies the YouTube
            /// subscription ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "subscriptions"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mine", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mine",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "forChannelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "forChannelId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "mySubscribers", new Google.Apis.Discovery.Parameter
                    {
                        Name = "mySubscribers",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "order", new Google.Apis.Discovery.Parameter
                    {
                        Name = "order",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "SUBSCRIPTION_ORDER_RELEVANCE",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "thumbnails" collection of methods.</summary>
    public class ThumbnailsResource
    {
        private const string Resource = "thumbnails";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public ThumbnailsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Uploads a custom video thumbnail to YouTube and sets it for a video.</summary>
        /// <param name="videoId">The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is
        /// being provided.</param>
        public virtual SetRequest Set(string videoId)
        {
            return new SetRequest(service, videoId);
        }

        /// <summary>Uploads a custom video thumbnail to YouTube and sets it for a video.</summary>
        public class SetRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.ThumbnailSetResponse>
        {
            /// <summary>Constructs a new Set request.</summary>
            public SetRequest(Google.Apis.Services.IClientService service, string videoId)
                : base(service)
            {
                VideoId = videoId;
                InitParameters();
            }


            /// <summary>The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is
            /// being provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoId { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "set"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "thumbnails/set"; }
            }

            /// <summary>Initializes Set parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "videoId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoId",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a custom video thumbnail to YouTube and sets it for a video.</summary>
        /// <param name="videoId">The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is
        /// being provided.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual SetMediaUpload Set(string videoId, System.IO.Stream stream, string contentType)
        {
            return new SetMediaUpload(service, videoId, stream, contentType);
        }

        /// <summary>Set media upload which supports resumable upload.</summary>
        public class SetMediaUpload : Google.Apis.Upload.ResumableUpload<string, Google.Apis.YouTube.v3.Data.ThumbnailSetResponse>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is
            /// being provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("videoId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoId { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>Constructs a new Set media upload instance.</summary>
            public SetMediaUpload(Google.Apis.Services.IClientService service, string
             videoId, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "thumbnails/set"), "POST", stream, contentType)
            {
                VideoId = videoId;
            }
        }
    }

    /// <summary>The "videoCategories" collection of methods.</summary>
    public class VideoCategoriesResource
    {
        private const string Resource = "videoCategories";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public VideoCategoriesResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns a list of categories that can be associated with YouTube videos.</summary>
        /// <param name="part">The part parameter specifies the videoCategory resource parts that the API response will include.
        /// Supported values are id and snippet.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of categories that can be associated with YouTube videos.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.VideoCategoryListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies the videoCategory resource parts that the API response will
            /// include. Supported values are id and snippet.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>The regionCode parameter instructs the API to return the list of video categories available in
            /// the specified country. The parameter value is an ISO 3166-1 alpha-2 country code.</summary>
            [Google.Apis.Util.RequestParameterAttribute("regionCode", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RegionCode { get; set; }

            /// <summary>The id parameter specifies a comma-separated list of video category IDs for the resources that
            /// you are retrieving.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }

            /// <summary>The hl parameter specifies the language that should be used for text values in the API
            /// response.</summary>
            /// [default: en_US]
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videoCategories"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "regionCode", new Google.Apis.Discovery.Parameter
                    {
                        Name = "regionCode",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "en_US",
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "videos" collection of methods.</summary>
    public class VideosResource
    {
        private const string Resource = "videos";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public VideosResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Deletes a YouTube video.</summary>
        /// <param name="id">The id parameter specifies the YouTube video ID for the resource that is being deleted. In a video
        /// resource, the id property specifies the video's ID.</param>
        public virtual DeleteRequest Delete(string id)
        {
            return new DeleteRequest(service, id);
        }

        /// <summary>Deletes a YouTube video.</summary>
        public class DeleteRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube video ID for the resource that is being deleted. In a
            /// video resource, the id property specifies the video's ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The actual CMS account
            /// that the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Retrieves the ratings that the authorized user gave to a list of specified videos.</summary>
        /// <param name="id">The id parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s)
        /// for which you are retrieving rating data. In a video resource, the id property specifies the video's
        /// ID.</param>
        public virtual GetRatingRequest GetRating(string id)
        {
            return new GetRatingRequest(service, id);
        }

        /// <summary>Retrieves the ratings that the authorized user gave to a list of specified videos.</summary>
        public class GetRatingRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.VideoGetRatingResponse>
        {
            /// <summary>Constructs a new GetRating request.</summary>
            public GetRatingRequest(Google.Apis.Services.IClientService service, string id)
                : base(service)
            {
                Id = id;
                InitParameters();
            }


            /// <summary>The id parameter specifies a comma-separated list of the YouTube video ID(s) for the
            /// resource(s) for which you are retrieving rating data. In a video resource, the id property specifies the
            /// video's ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "getRating"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos/getRating"; }
            }

            /// <summary>Initializes GetRating parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a video to YouTube and optionally sets the video's metadata.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
        /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status, suggestions,
        /// and topicDetails. However, not all of those parts contain properties that can be set when setting or updating a
        /// video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and
        /// does not contain values that you can set or modify. If the parameter value specifies a part that does not contain
        /// mutable values, that part will still be included in the API response.</param>
        public virtual InsertRequest Insert(Google.Apis.YouTube.v3.Data.Video body, string part)
        {
            return new InsertRequest(service, body, part);
        }

        /// <summary>Uploads a video to YouTube and optionally sets the video's metadata.</summary>
        public class InsertRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Video>
        {
            /// <summary>Constructs a new Insert request.</summary>
            public InsertRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Video body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
            /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status,
            /// suggestions, and topicDetails. However, not all of those parts contain properties that can be set when
            /// setting or updating a video's metadata. For example, the statistics object encapsulates statistics that
            /// YouTube calculates for a video and does not contain values that you can set or modify. If the parameter
            /// value specifies a part that does not contain mutable values, that part will still be included in the API
            /// response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The stabilize parameter indicates whether YouTube should adjust the video to remove shaky
            /// camera motions.</summary>
            [Google.Apis.Util.RequestParameterAttribute("stabilize", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Stabilize { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The notifySubscribers parameter indicates whether YouTube should send notification to
            /// subscribers about the inserted video.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("notifySubscribers", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> NotifySubscribers { get; set; }

            /// <summary>The autoLevels parameter indicates whether YouTube should automatically enhance the video's
            /// lighting and color.</summary>
            [Google.Apis.Util.RequestParameterAttribute("autoLevels", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> AutoLevels { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Video Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "insert"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos"; }
            }

            /// <summary>Initializes Insert parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "stabilize", new Google.Apis.Discovery.Parameter
                    {
                        Name = "stabilize",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwnerChannel", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwnerChannel",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "notifySubscribers", new Google.Apis.Discovery.Parameter
                    {
                        Name = "notifySubscribers",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "true",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "autoLevels", new Google.Apis.Discovery.Parameter
                    {
                        Name = "autoLevels",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a video to YouTube and optionally sets the video's metadata.</summary>/// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
        /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status, suggestions,
        /// and topicDetails. However, not all of those parts contain properties that can be set when setting or updating a
        /// video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and
        /// does not contain values that you can set or modify. If the parameter value specifies a part that does not contain
        /// mutable values, that part will still be included in the API response.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual InsertMediaUpload Insert(Google.Apis.YouTube.v3.Data.Video body, string part, System.IO.Stream stream, string contentType)
        {
            return new InsertMediaUpload(service, body, part, stream, contentType);
        }

        /// <summary>Insert media upload which supports resumable upload.</summary>
        public class InsertMediaUpload : Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.Video, Google.Apis.YouTube.v3.Data.Video>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
            /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status,
            /// suggestions, and topicDetails. However, not all of those parts contain properties that can be set when
            /// setting or updating a video's metadata. For example, the statistics object encapsulates statistics that
            /// YouTube calculates for a video and does not contain values that you can set or modify. If the parameter
            /// value specifies a part that does not contain mutable values, that part will still be included in the API
            /// response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The stabilize parameter indicates whether YouTube should adjust the video to remove shaky
            /// camera motions.</summary>
            [Google.Apis.Util.RequestParameterAttribute("stabilize", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> Stabilize { get; set; }

            /// <summary>This parameter can only be used in a properly authorized request. Note: This parameter is
            /// intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwnerChannel parameter specifies the YouTube channel ID of the channel to which a
            /// video is being added. This parameter is required when a request specifies a value for the
            /// onBehalfOfContentOwner parameter, and it can only be used in conjunction with that parameter. In
            /// addition, the request must be authorized using a CMS account that is linked to the content owner that
            /// the onBehalfOfContentOwner parameter specifies. Finally, the channel that the
            /// onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the
            /// onBehalfOfContentOwner parameter specifies.
            ///
            /// This parameter is intended for YouTube content partners that own and manage many different YouTube
            /// channels. It allows content owners to authenticate once and perform actions on behalf of the channel
            /// specified in the parameter value, without having to provide authentication credentials for each separate
            /// channel.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwnerChannel", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwnerChannel { get; set; }

            /// <summary>The notifySubscribers parameter indicates whether YouTube should send notification to
            /// subscribers about the inserted video.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("notifySubscribers", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> NotifySubscribers { get; set; }

            /// <summary>The autoLevels parameter indicates whether YouTube should automatically enhance the video's
            /// lighting and color.</summary>
            [Google.Apis.Util.RequestParameterAttribute("autoLevels", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> AutoLevels { get; set; }

            /// <summary>Constructs a new Insert media upload instance.</summary>
            public InsertMediaUpload(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Video body, string
             part, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "videos"), "POST", stream, contentType)
            {
                Part = part;
                Body = body;
            }
        }

        /// <summary>Returns a list of videos that match the API request parameters.</summary>
        /// <param name="part">The part parameter specifies a comma-separated list of one or more video resource properties that
        /// the API response will include. The part names that you can include in the parameter value are id, snippet,
        /// contentDetails, fileDetails, liveStreamingDetails, localizations, player, processingDetails, recordingDetails,
        /// statistics, status, suggestions, and topicDetails.
        ///
        /// If the parameter identifies a property that contains child properties, the child properties will be included in the
        /// response. For example, in a video resource, the snippet property contains the channelId, title, description, tags,
        /// and categoryId properties. As such, if you set part=snippet, the API response will contain all of those
        /// properties.</param>
        public virtual ListRequest List(string part)
        {
            return new ListRequest(service, part);
        }

        /// <summary>Returns a list of videos that match the API request parameters.</summary>
        public class ListRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.VideoListResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string part)
                : base(service)
            {
                Part = part;
                InitParameters();
            }


            /// <summary>The part parameter specifies a comma-separated list of one or more video resource properties
            /// that the API response will include. The part names that you can include in the parameter value are id,
            /// snippet, contentDetails, fileDetails, liveStreamingDetails, localizations, player, processingDetails,
            /// recordingDetails, statistics, status, suggestions, and topicDetails.
            ///
            /// If the parameter identifies a property that contains child properties, the child properties will be
            /// included in the response. For example, in a video resource, the snippet property contains the channelId,
            /// title, description, tags, and categoryId properties. As such, if you set part=snippet, the API response
            /// will contain all of those properties.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>The regionCode parameter instructs the API to select a video chart available in the specified
            /// region. This parameter can only be used in conjunction with the chart parameter. The parameter value is
            /// an ISO 3166-1 alpha-2 country code.</summary>
            [Google.Apis.Util.RequestParameterAttribute("regionCode", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string RegionCode { get; set; }

            /// <summary>DEPRECATED</summary>
            [Google.Apis.Util.RequestParameterAttribute("locale", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Locale { get; set; }

            /// <summary>The videoCategoryId parameter identifies the video category for which the chart should be
            /// retrieved. This parameter can only be used in conjunction with the chart parameter. By default, charts
            /// are not restricted to a particular category.</summary>
            /// [default: 0]
            [Google.Apis.Util.RequestParameterAttribute("videoCategoryId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string VideoCategoryId { get; set; }

            /// <summary>The chart parameter identifies the chart that you want to retrieve.</summary>
            [Google.Apis.Util.RequestParameterAttribute("chart", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<ChartEnum> Chart { get; set; }

            /// <summary>The chart parameter identifies the chart that you want to retrieve.</summary>
            public enum ChartEnum
            {
                /// <summary>Return the most popular videos for the specified content region and video
                /// category.</summary>
                [Google.Apis.Util.StringValueAttribute("mostPopular")]
                MostPopular,
            }

            /// <summary>The maxResults parameter specifies the maximum number of items that should be returned in the
            /// result set.
            ///
            /// Note: This parameter is supported for use in conjunction with the myRating parameter, but it is not
            /// supported for use in conjunction with the id parameter.</summary>
            /// [default: 5]
            /// [minimum: 1]
            /// [maximum: 50]
            [Google.Apis.Util.RequestParameterAttribute("maxResults", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<long> MaxResults { get; set; }

            /// <summary>The pageToken parameter identifies a specific page in the result set that should be returned.
            /// In an API response, the nextPageToken and prevPageToken properties identify other pages that could be
            /// retrieved.
            ///
            /// Note: This parameter is supported for use in conjunction with the myRating parameter, but it is not
            /// supported for use in conjunction with the id parameter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }

            /// <summary>The hl parameter instructs the API to return a localized version of the video details. If
            /// localized text is nor available for the requested language, the localizations object in the API response
            /// will contain the requested information in the default language instead. The parameter value is a BCP-47
            /// language code. Your application can determine whether the requested localization was returned by
            /// checking the value of the snippet.localized.language property in the API response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("hl", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Hl { get; set; }

            /// <summary>Set this parameter's value to like or dislike to instruct the API to only return videos liked
            /// or disliked by the authenticated user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("myRating", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<MyRatingEnum> MyRating { get; set; }

            /// <summary>Set this parameter's value to like or dislike to instruct the API to only return videos liked
            /// or disliked by the authenticated user.</summary>
            public enum MyRatingEnum
            {
                /// <summary>Returns only videos disliked by the authenticated user.</summary>
                [Google.Apis.Util.StringValueAttribute("dislike")]
                Dislike,
                /// <summary>Returns only video liked by the authenticated user.</summary>
                [Google.Apis.Util.StringValueAttribute("like")]
                Like,
            }

            /// <summary>The id parameter specifies a comma-separated list of the YouTube video ID(s) for the
            /// resource(s) that are being retrieved. In a video resource, the id property specifies the video's
            /// ID.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "regionCode", new Google.Apis.Discovery.Parameter
                    {
                        Name = "regionCode",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "locale", new Google.Apis.Discovery.Parameter
                    {
                        Name = "locale",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "videoCategoryId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "videoCategoryId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "0",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "chart", new Google.Apis.Discovery.Parameter
                    {
                        Name = "chart",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "maxResults", new Google.Apis.Discovery.Parameter
                    {
                        Name = "maxResults",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = "5",
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "hl", new Google.Apis.Discovery.Parameter
                    {
                        Name = "hl",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "myRating", new Google.Apis.Discovery.Parameter
                    {
                        Name = "myRating",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Add a like or dislike rating to a video or remove a rating from a video.</summary>
        /// <param name="id">The id parameter specifies the YouTube video ID of the video that is being rated or having its
        /// rating removed.</param>
        /// <param name="rating">Specifies the rating to record.</param>
        public virtual RateRequest Rate(string id, RateRequest.RatingEnum rating)
        {
            return new RateRequest(service, id, rating);
        }

        /// <summary>Add a like or dislike rating to a video or remove a rating from a video.</summary>
        public class RateRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Rate request.</summary>
            public RateRequest(Google.Apis.Services.IClientService service, string id, RateRequest.RatingEnum rating)
                : base(service)
            {
                Id = id;
                Rating = rating;
                InitParameters();
            }


            /// <summary>The id parameter specifies the YouTube video ID of the video that is being rated or having its
            /// rating removed.</summary>
            [Google.Apis.Util.RequestParameterAttribute("id", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Id { get; private set; }

            /// <summary>Specifies the rating to record.</summary>
            [Google.Apis.Util.RequestParameterAttribute("rating", Google.Apis.Util.RequestParameterType.Query)]
            public virtual RatingEnum Rating { get; private set; }

            /// <summary>Specifies the rating to record.</summary>
            public enum RatingEnum
            {
                /// <summary>Records that the authenticated user disliked the video.</summary>
                [Google.Apis.Util.StringValueAttribute("dislike")]
                Dislike,
                /// <summary>Records that the authenticated user liked the video.</summary>
                [Google.Apis.Util.StringValueAttribute("like")]
                Like,
                /// <summary>Removes any rating that the authenticated user had previously set for the video.</summary>
                [Google.Apis.Util.StringValueAttribute("none")]
                None,
            }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The CMS account that
            /// the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "rate"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos/rate"; }
            }

            /// <summary>Initializes Rate parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "id", new Google.Apis.Discovery.Parameter
                    {
                        Name = "id",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "rating", new Google.Apis.Discovery.Parameter
                    {
                        Name = "rating",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a video's metadata.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="part">The part parameter serves two purposes in this operation. It identifies the properties that the
        /// write operation will set as well as the properties that the API response will include.
        ///
        /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
        /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status, suggestions,
        /// and topicDetails.
        ///
        /// Note that this method will override the existing values for all of the mutable properties that are contained in any
        /// parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As
        /// such, if your request is updating a private video, and the request's part parameter value includes the status part,
        /// the video's privacy setting will be updated to whatever value the request body specifies. If the request body does
        /// not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy
        /// setting.
        ///
        /// In addition, not all of those parts contain properties that can be set when setting or updating a video's metadata.
        /// For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain
        /// values that you can set or modify. If the parameter value specifies a part that does not contain mutable values,
        /// that part will still be included in the API response.</param>
        public virtual UpdateRequest Update(Google.Apis.YouTube.v3.Data.Video body, string part)
        {
            return new UpdateRequest(service, body, part);
        }

        /// <summary>Updates a video's metadata.</summary>
        public class UpdateRequest : YouTubeBaseServiceRequest<Google.Apis.YouTube.v3.Data.Video>
        {
            /// <summary>Constructs a new Update request.</summary>
            public UpdateRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.Video body, string part)
                : base(service)
            {
                Part = part;
                Body = body;
                InitParameters();
            }


            /// <summary>The part parameter serves two purposes in this operation. It identifies the properties that the
            /// write operation will set as well as the properties that the API response will include.
            ///
            /// The part names that you can include in the parameter value are snippet, contentDetails, fileDetails,
            /// liveStreamingDetails, localizations, player, processingDetails, recordingDetails, statistics, status,
            /// suggestions, and topicDetails.
            ///
            /// Note that this method will override the existing values for all of the mutable properties that are
            /// contained in any parts that the parameter value specifies. For example, a video's privacy setting is
            /// contained in the status part. As such, if your request is updating a private video, and the request's
            /// part parameter value includes the status part, the video's privacy setting will be updated to whatever
            /// value the request body specifies. If the request body does not specify a value, the existing privacy
            /// setting will be removed and the video will revert to the default privacy setting.
            ///
            /// In addition, not all of those parts contain properties that can be set when setting or updating a
            /// video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for
            /// a video and does not contain values that you can set or modify. If the parameter value specifies a part
            /// that does not contain mutable values, that part will still be included in the API response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("part", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Part { get; private set; }

            /// <summary>Note: This parameter is intended exclusively for YouTube content partners.
            ///
            /// The onBehalfOfContentOwner parameter indicates that the request's authorization credentials identify a
            /// YouTube CMS user who is acting on behalf of the content owner specified in the parameter value. This
            /// parameter is intended for YouTube content partners that own and manage many different YouTube channels.
            /// It allows content owners to authenticate once and get access to all their video and channel data,
            /// without having to provide authentication credentials for each individual channel. The actual CMS account
            /// that the user authenticates with must be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.Video Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "update"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PUT"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "videos"; }
            }

            /// <summary>Initializes Update parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "part", new Google.Apis.Discovery.Parameter
                    {
                        Name = "part",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "watermarks" collection of methods.</summary>
    public class WatermarksResource
    {
        private const string Resource = "watermarks";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public WatermarksResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Uploads a watermark image to YouTube and sets it for a channel.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="channelId">The channelId parameter specifies a YouTube channel ID for which the watermark is being
        /// provided.</param>
        public virtual SetRequest Set(Google.Apis.YouTube.v3.Data.InvideoBranding body, string channelId)
        {
            return new SetRequest(service, body, channelId);
        }

        /// <summary>Uploads a watermark image to YouTube and sets it for a channel.</summary>
        public class SetRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Set request.</summary>
            public SetRequest(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.InvideoBranding body, string channelId)
                : base(service)
            {
                ChannelId = channelId;
                Body = body;
                InitParameters();
            }


            /// <summary>The channelId parameter specifies a YouTube channel ID for which the watermark is being
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.YouTube.v3.Data.InvideoBranding Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "set"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "watermarks/set"; }
            }

            /// <summary>Initializes Set parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Uploads a watermark image to YouTube and sets it for a channel.</summary>/// <param name="body">The body of the request.</param>
        /// <param name="channelId">The channelId parameter specifies a YouTube channel ID for which the watermark is being
        /// provided.</param>
        /// <param name="stream">The stream to upload.</param>
        /// <param name="contentType">The content type of the stream to upload.</param>
        public virtual SetMediaUpload Set(Google.Apis.YouTube.v3.Data.InvideoBranding body, string channelId, System.IO.Stream stream, string contentType)
        {
            return new SetMediaUpload(service, body, channelId, stream, contentType);
        }

        /// <summary>Set media upload which supports resumable upload.</summary>
        public class SetMediaUpload : Google.Apis.Upload.ResumableUpload<Google.Apis.YouTube.v3.Data.InvideoBranding>
        {

            /// <summary>Data format for the response.</summary>
            /// [default: json]
            [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<AltEnum> Alt { get; set; }

            /// <summary>Data format for the response.</summary>
            public enum AltEnum
            {
                /// <summary>Responses with Content-Type of application/json</summary>
                [Google.Apis.Util.StringValueAttribute("json")]
                Json,
            }

            /// <summary>Selector specifying which fields to include in a partial response.</summary>
            [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Fields { get; set; }

            /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and
            /// reports. Required unless you provide an OAuth 2.0 token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Key { get; set; }

            /// <summary>OAuth 2.0 token for the current user.</summary>
            [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OauthToken { get; set; }

            /// <summary>Returns response with indentations and line breaks.</summary>
            /// [default: true]
            [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<bool> PrettyPrint { get; set; }

            /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
            /// assigned to a user, but should not exceed 40 characters. Overrides userIp if both are
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string QuotaUser { get; set; }

            /// <summary>IP address of the site where the request originates. Use this if you want to enforce per-user
            /// limits.</summary>
            [Google.Apis.Util.RequestParameterAttribute("userIp", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string UserIp { get; set; }


            /// <summary>The channelId parameter specifies a YouTube channel ID for which the watermark is being
            /// provided.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }

            /// <summary>Constructs a new Set media upload instance.</summary>
            public SetMediaUpload(Google.Apis.Services.IClientService service, Google.Apis.YouTube.v3.Data.InvideoBranding body, string
             channelId, System.IO.Stream stream, string contentType)
                : base(service, string.Format("/{0}/{1}{2}", "upload", service.BasePath, "watermarks/set"), "POST", stream, contentType)
            {
                ChannelId = channelId;
                Body = body;
            }
        }

        /// <summary>Deletes a watermark.</summary>
        /// <param name="channelId">The channelId parameter specifies a YouTube channel ID for which the watermark is being
        /// unset.</param>
        public virtual UnsetRequest Unset(string channelId)
        {
            return new UnsetRequest(service, channelId);
        }

        /// <summary>Deletes a watermark.</summary>
        public class UnsetRequest : YouTubeBaseServiceRequest<string>
        {
            /// <summary>Constructs a new Unset request.</summary>
            public UnsetRequest(Google.Apis.Services.IClientService service, string channelId)
                : base(service)
            {
                ChannelId = channelId;
                InitParameters();
            }


            /// <summary>The channelId parameter specifies a YouTube channel ID for which the watermark is being
            /// unset.</summary>
            [Google.Apis.Util.RequestParameterAttribute("channelId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ChannelId { get; private set; }

            /// <summary>The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf
            /// of the content owner specified in the parameter value. This parameter is intended for YouTube content
            /// partners that own and manage many different YouTube channels. It allows content owners to authenticate
            /// once and get access to all their video and channel data, without having to provide authentication
            /// credentials for each individual channel. The actual CMS account that the user authenticates with needs
            /// to be linked to the specified YouTube content owner.</summary>
            [Google.Apis.Util.RequestParameterAttribute("onBehalfOfContentOwner", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string OnBehalfOfContentOwner { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "unset"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "watermarks/unset"; }
            }

            /// <summary>Initializes Unset parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "channelId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "channelId",
                        IsRequired = true,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "onBehalfOfContentOwner", new Google.Apis.Discovery.Parameter
                    {
                        Name = "onBehalfOfContentOwner",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }
}
